mirror of https://github.com/xemu-project/xemu.git
Migration pull request
- Li Zhijian's COLO minor fixes - Marc-André's virtio-gpu fix - Fiona's virtio-net USO fix - A couple of migration-test fixes from Thomas -----BEGIN PGP SIGNATURE----- iQJEBAABCAAuFiEEqhtIsKIjJqWkw2TPx5jcdBvsMZ0FAmZObggQHGZhcm9zYXNA c3VzZS5kZQAKCRDHmNx0G+wxnWE8D/49RGE+g29qyk9aKx3lU8mSq+ZzmX5GncBt 5+Mx5qoHDsBCQTE+dQpEVIoeMJ2HIbgbOML4qsnp6Hw/4/TWkfwC/R6+ZmHBevRk fVLkVh2JMHVg8Tq+0FO1X1QnMU03uJ7EAuWdDa8HqlJ5dQY/K3gDaku8oQBXk96X 13pChSbMob76tdb+wiwbdEakabigH7XfrPdI6lzI8MCGTIcPKc/UKTFYuoj/OsNx raqy+uBtvKtfHxiaYnIgHIPNAF/1f4tP3iAOcPoZWIMXWxFkE8+ANDJAbWo6xIcL DGg/wEzZO/OnXLjOhjvLBUHK/fx4wQ5bsqA09BVxoRyBGblkXr+bcwBLYjgiEqzT aniPiAx5W/Db+T7HqZPIWesFYj3cmcwvYUTrx/RPMdC0epG+ZczDMtescHdZbxvt Pjs3nFeCLhyYcVhlTI72eXRCxdd/26+r6/OmrBC2+GaZrybM61TvNo+3XvO0Pfhi UmwF2EN27XmSMelLvH/MnflUVgBHKDs3CCQzDlxreHq2jMVR0SL7LU5wMJJ58Iok M3u74izQM25bwYxiASH+4iRn0puH1mOwgOx28W0uiQfZY/678/lCnwa1Tul15BRE fIQZJhyIGzhSpwLqEXmdXdlLQs1isqIgpd/mzKgZ285nLr7kz+4gxCUqiXgVbrl7 P45Dym1u4g== =DDrh -----END PGP SIGNATURE----- Merge tag 'migration-20240522-pull-request' of https://gitlab.com/farosas/qemu into staging Migration pull request - Li Zhijian's COLO minor fixes - Marc-André's virtio-gpu fix - Fiona's virtio-net USO fix - A couple of migration-test fixes from Thomas # -----BEGIN PGP SIGNATURE----- # # iQJEBAABCAAuFiEEqhtIsKIjJqWkw2TPx5jcdBvsMZ0FAmZObggQHGZhcm9zYXNA # c3VzZS5kZQAKCRDHmNx0G+wxnWE8D/49RGE+g29qyk9aKx3lU8mSq+ZzmX5GncBt # 5+Mx5qoHDsBCQTE+dQpEVIoeMJ2HIbgbOML4qsnp6Hw/4/TWkfwC/R6+ZmHBevRk # fVLkVh2JMHVg8Tq+0FO1X1QnMU03uJ7EAuWdDa8HqlJ5dQY/K3gDaku8oQBXk96X # 13pChSbMob76tdb+wiwbdEakabigH7XfrPdI6lzI8MCGTIcPKc/UKTFYuoj/OsNx # raqy+uBtvKtfHxiaYnIgHIPNAF/1f4tP3iAOcPoZWIMXWxFkE8+ANDJAbWo6xIcL # DGg/wEzZO/OnXLjOhjvLBUHK/fx4wQ5bsqA09BVxoRyBGblkXr+bcwBLYjgiEqzT # aniPiAx5W/Db+T7HqZPIWesFYj3cmcwvYUTrx/RPMdC0epG+ZczDMtescHdZbxvt # Pjs3nFeCLhyYcVhlTI72eXRCxdd/26+r6/OmrBC2+GaZrybM61TvNo+3XvO0Pfhi # UmwF2EN27XmSMelLvH/MnflUVgBHKDs3CCQzDlxreHq2jMVR0SL7LU5wMJJ58Iok # M3u74izQM25bwYxiASH+4iRn0puH1mOwgOx28W0uiQfZY/678/lCnwa1Tul15BRE # fIQZJhyIGzhSpwLqEXmdXdlLQs1isqIgpd/mzKgZ285nLr7kz+4gxCUqiXgVbrl7 # P45Dym1u4g== # =DDrh # -----END PGP SIGNATURE----- # gpg: Signature made Wed 22 May 2024 03:13:28 PM PDT # gpg: using RSA key AA1B48B0A22326A5A4C364CFC798DC741BEC319D # gpg: issuer "farosas@suse.de" # gpg: Good signature from "Fabiano Rosas <farosas@suse.de>" [unknown] # gpg: aka "Fabiano Almeida Rosas <fabiano.rosas@suse.com>" [unknown] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: AA1B 48B0 A223 26A5 A4C3 64CF C798 DC74 1BEC 319D * tag 'migration-20240522-pull-request' of https://gitlab.com/farosas/qemu: tests/qtest/migration-test: Fix the check for a successful run of analyze-migration.py tests/qtest/migration-test: Run some basic tests on s390x and ppc64 with TCG, too hw/core/machine: move compatibility flags for VirtIO-net USO to machine 8.1 virtio-gpu: fix v2 migration migration: fix a typo migration: add "exists" info to load-state-field trace migration/colo: Tidy up bql_unlock() around bdrv_activate_all() migration/colo: make colo_incoming_co() return void migration/colo: Minor fix for colo error message Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
7e1c004701
|
@ -43,6 +43,7 @@ GlobalProperty hw_compat_8_2[] = {
|
|||
{ "migration", "zero-page-detection", "legacy"},
|
||||
{ TYPE_VIRTIO_IOMMU_PCI, "granule", "4k" },
|
||||
{ TYPE_VIRTIO_IOMMU_PCI, "aw-bits", "64" },
|
||||
{ "virtio-gpu-device", "x-scanout-vmstate-version", "1" },
|
||||
};
|
||||
const size_t hw_compat_8_2_len = G_N_ELEMENTS(hw_compat_8_2);
|
||||
|
||||
|
@ -51,15 +52,15 @@ GlobalProperty hw_compat_8_1[] = {
|
|||
{ "ramfb", "x-migrate", "off" },
|
||||
{ "vfio-pci-nohotplug", "x-ramfb-migrate", "off" },
|
||||
{ "igb", "x-pcie-flr-init", "off" },
|
||||
{ TYPE_VIRTIO_NET, "host_uso", "off"},
|
||||
{ TYPE_VIRTIO_NET, "guest_uso4", "off"},
|
||||
{ TYPE_VIRTIO_NET, "guest_uso6", "off"},
|
||||
};
|
||||
const size_t hw_compat_8_1_len = G_N_ELEMENTS(hw_compat_8_1);
|
||||
|
||||
GlobalProperty hw_compat_8_0[] = {
|
||||
{ "migration", "multifd-flush-after-each-section", "on"},
|
||||
{ TYPE_PCI_DEVICE, "x-pcie-ari-nextfn-1", "on" },
|
||||
{ TYPE_VIRTIO_NET, "host_uso", "off"},
|
||||
{ TYPE_VIRTIO_NET, "guest_uso4", "off"},
|
||||
{ TYPE_VIRTIO_NET, "guest_uso6", "off"},
|
||||
};
|
||||
const size_t hw_compat_8_0_len = G_N_ELEMENTS(hw_compat_8_0);
|
||||
|
||||
|
|
|
@ -1166,10 +1166,17 @@ static void virtio_gpu_cursor_bh(void *opaque)
|
|||
virtio_gpu_handle_cursor(&g->parent_obj.parent_obj, g->cursor_vq);
|
||||
}
|
||||
|
||||
static bool scanout_vmstate_after_v2(void *opaque, int version)
|
||||
{
|
||||
struct VirtIOGPUBase *base = container_of(opaque, VirtIOGPUBase, scanout);
|
||||
struct VirtIOGPU *gpu = container_of(base, VirtIOGPU, parent_obj);
|
||||
|
||||
return gpu->scanout_vmstate_version >= 2;
|
||||
}
|
||||
|
||||
static const VMStateDescription vmstate_virtio_gpu_scanout = {
|
||||
.name = "virtio-gpu-one-scanout",
|
||||
.version_id = 2,
|
||||
.minimum_version_id = 1,
|
||||
.version_id = 1,
|
||||
.fields = (const VMStateField[]) {
|
||||
VMSTATE_UINT32(resource_id, struct virtio_gpu_scanout),
|
||||
VMSTATE_UINT32(width, struct virtio_gpu_scanout),
|
||||
|
@ -1181,12 +1188,18 @@ static const VMStateDescription vmstate_virtio_gpu_scanout = {
|
|||
VMSTATE_UINT32(cursor.hot_y, struct virtio_gpu_scanout),
|
||||
VMSTATE_UINT32(cursor.pos.x, struct virtio_gpu_scanout),
|
||||
VMSTATE_UINT32(cursor.pos.y, struct virtio_gpu_scanout),
|
||||
VMSTATE_UINT32_V(fb.format, struct virtio_gpu_scanout, 2),
|
||||
VMSTATE_UINT32_V(fb.bytes_pp, struct virtio_gpu_scanout, 2),
|
||||
VMSTATE_UINT32_V(fb.width, struct virtio_gpu_scanout, 2),
|
||||
VMSTATE_UINT32_V(fb.height, struct virtio_gpu_scanout, 2),
|
||||
VMSTATE_UINT32_V(fb.stride, struct virtio_gpu_scanout, 2),
|
||||
VMSTATE_UINT32_V(fb.offset, struct virtio_gpu_scanout, 2),
|
||||
VMSTATE_UINT32_TEST(fb.format, struct virtio_gpu_scanout,
|
||||
scanout_vmstate_after_v2),
|
||||
VMSTATE_UINT32_TEST(fb.bytes_pp, struct virtio_gpu_scanout,
|
||||
scanout_vmstate_after_v2),
|
||||
VMSTATE_UINT32_TEST(fb.width, struct virtio_gpu_scanout,
|
||||
scanout_vmstate_after_v2),
|
||||
VMSTATE_UINT32_TEST(fb.height, struct virtio_gpu_scanout,
|
||||
scanout_vmstate_after_v2),
|
||||
VMSTATE_UINT32_TEST(fb.stride, struct virtio_gpu_scanout,
|
||||
scanout_vmstate_after_v2),
|
||||
VMSTATE_UINT32_TEST(fb.offset, struct virtio_gpu_scanout,
|
||||
scanout_vmstate_after_v2),
|
||||
VMSTATE_END_OF_LIST()
|
||||
},
|
||||
};
|
||||
|
@ -1659,6 +1672,7 @@ static Property virtio_gpu_properties[] = {
|
|||
DEFINE_PROP_BIT("blob", VirtIOGPU, parent_obj.conf.flags,
|
||||
VIRTIO_GPU_FLAG_BLOB_ENABLED, false),
|
||||
DEFINE_PROP_SIZE("hostmem", VirtIOGPU, parent_obj.conf.hostmem, 0),
|
||||
DEFINE_PROP_UINT8("x-scanout-vmstate-version", VirtIOGPU, scanout_vmstate_version, 2),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
|
|
|
@ -177,6 +177,7 @@ typedef struct VGPUDMABuf {
|
|||
struct VirtIOGPU {
|
||||
VirtIOGPUBase parent_obj;
|
||||
|
||||
uint8_t scanout_vmstate_version;
|
||||
uint64_t conf_max_hostmem;
|
||||
|
||||
VirtQueue *ctrl_vq;
|
||||
|
|
|
@ -49,7 +49,7 @@ void colo_checkpoint_delay_set(void);
|
|||
*
|
||||
* Called with BQL locked, may temporary release BQL.
|
||||
*/
|
||||
int coroutine_fn colo_incoming_co(void);
|
||||
void coroutine_fn colo_incoming_co(void);
|
||||
|
||||
void colo_shutdown(void);
|
||||
#endif
|
||||
|
|
|
@ -9,9 +9,8 @@ void colo_shutdown(void)
|
|||
{
|
||||
}
|
||||
|
||||
int coroutine_fn colo_incoming_co(void)
|
||||
void coroutine_fn colo_incoming_co(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void colo_checkpoint_delay_set(void)
|
||||
|
|
|
@ -837,12 +837,11 @@ static void *colo_process_incoming_thread(void *opaque)
|
|||
/* Make sure all file formats throw away their mutable metadata */
|
||||
bql_lock();
|
||||
bdrv_activate_all(&local_err);
|
||||
bql_unlock();
|
||||
if (local_err) {
|
||||
bql_unlock();
|
||||
error_report_err(local_err);
|
||||
return NULL;
|
||||
}
|
||||
bql_unlock();
|
||||
|
||||
failover_init_state();
|
||||
|
||||
|
@ -928,16 +927,13 @@ out:
|
|||
return NULL;
|
||||
}
|
||||
|
||||
int coroutine_fn colo_incoming_co(void)
|
||||
void coroutine_fn colo_incoming_co(void)
|
||||
{
|
||||
MigrationIncomingState *mis = migration_incoming_get_current();
|
||||
QemuThread th;
|
||||
|
||||
assert(bql_locked());
|
||||
|
||||
if (!migration_incoming_colo_enabled()) {
|
||||
return 0;
|
||||
}
|
||||
assert(migration_incoming_colo_enabled());
|
||||
|
||||
qemu_thread_create(&th, "COLO incoming", colo_process_incoming_thread,
|
||||
mis, QEMU_THREAD_JOINABLE);
|
||||
|
@ -953,6 +949,4 @@ int coroutine_fn colo_incoming_co(void)
|
|||
|
||||
/* We hold the global BQL, so it is safe here */
|
||||
colo_release_ram_cache();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -513,13 +513,13 @@ void migration_incoming_disable_colo(void)
|
|||
int migration_incoming_enable_colo(void)
|
||||
{
|
||||
#ifndef CONFIG_REPLICATION
|
||||
error_report("ENABLE_COLO command come in migration stream, but COLO "
|
||||
"module is not built in");
|
||||
error_report("ENABLE_COLO command come in migration stream, but the "
|
||||
"replication module is not built in");
|
||||
return -ENOTSUP;
|
||||
#endif
|
||||
|
||||
if (!migrate_colo()) {
|
||||
error_report("ENABLE_COLO command come in migration stream, but c-colo "
|
||||
error_report("ENABLE_COLO command come in migration stream, but x-colo "
|
||||
"capability is not set");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -776,9 +776,9 @@ process_incoming_migration_co(void *opaque)
|
|||
goto fail;
|
||||
}
|
||||
|
||||
if (colo_incoming_co() < 0) {
|
||||
error_setg(&local_err, "colo incoming failed");
|
||||
goto fail;
|
||||
if (migration_incoming_colo_enabled()) {
|
||||
/* yield until COLO exit */
|
||||
colo_incoming_co();
|
||||
}
|
||||
|
||||
migration_bh_schedule(process_incoming_migration_bh, mis);
|
||||
|
|
|
@ -58,7 +58,7 @@ postcopy_page_req_sync(void *host_addr) "sync page req %p"
|
|||
vmstate_load_field_error(const char *field, int ret) "field \"%s\" load failed, ret = %d"
|
||||
vmstate_load_state(const char *name, int version_id) "%s v%d"
|
||||
vmstate_load_state_end(const char *name, const char *reason, int val) "%s %s/%d"
|
||||
vmstate_load_state_field(const char *name, const char *field) "%s:%s"
|
||||
vmstate_load_state_field(const char *name, const char *field, bool exists) "%s:%s exists=%d"
|
||||
vmstate_n_elems(const char *name, int n_elems) "%s: %d"
|
||||
vmstate_subsection_load(const char *parent) "%s"
|
||||
vmstate_subsection_load_bad(const char *parent, const char *sub, const char *sub2) "%s: %s/%s"
|
||||
|
|
|
@ -128,8 +128,9 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
|
|||
}
|
||||
}
|
||||
while (field->name) {
|
||||
trace_vmstate_load_state_field(vmsd->name, field->name);
|
||||
if (vmstate_field_exists(vmsd, field, opaque, version_id)) {
|
||||
bool exists = vmstate_field_exists(vmsd, field, opaque, version_id);
|
||||
trace_vmstate_load_state_field(vmsd->name, field->name, exists);
|
||||
if (exists) {
|
||||
void *first_elem = opaque + field->offset;
|
||||
int i, n_elems = vmstate_n_elems(opaque, field);
|
||||
int size = vmstate_size(opaque, field);
|
||||
|
@ -478,7 +479,7 @@ static int vmstate_subsection_load(QEMUFile *f, const VMStateDescription *vmsd,
|
|||
|
||||
len = qemu_peek_byte(f, 1);
|
||||
if (len < strlen(vmsd->name) + 1) {
|
||||
/* subsection name has be be "section_name/a" */
|
||||
/* subsection name has to be "section_name/a" */
|
||||
trace_vmstate_subsection_load_bad(vmsd->name, "(short)", "");
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1604,7 +1604,7 @@ static void test_analyze_script(void)
|
|||
}
|
||||
|
||||
g_assert(waitpid(pid, &wstatus, 0) == pid);
|
||||
if (WIFEXITED(wstatus) && WEXITSTATUS(wstatus) != 0) {
|
||||
if (!WIFEXITED(wstatus) || WEXITSTATUS(wstatus) != 0) {
|
||||
g_test_message("Failed to analyze the migration stream");
|
||||
g_test_fail();
|
||||
}
|
||||
|
@ -3437,26 +3437,6 @@ int main(int argc, char **argv)
|
|||
arch = qtest_get_arch();
|
||||
is_x86 = !strcmp(arch, "i386") || !strcmp(arch, "x86_64");
|
||||
|
||||
/*
|
||||
* On ppc64, the test only works with kvm-hv, but not with kvm-pr and TCG
|
||||
* is touchy due to race conditions on dirty bits (especially on PPC for
|
||||
* some reason)
|
||||
*/
|
||||
if (g_str_equal(arch, "ppc64") &&
|
||||
(!has_kvm || access("/sys/module/kvm_hv", F_OK))) {
|
||||
g_test_message("Skipping test: kvm_hv not available");
|
||||
return g_test_run();
|
||||
}
|
||||
|
||||
/*
|
||||
* Similar to ppc64, s390x seems to be touchy with TCG, so disable it
|
||||
* there until the problems are resolved
|
||||
*/
|
||||
if (g_str_equal(arch, "s390x") && !has_kvm) {
|
||||
g_test_message("Skipping test: s390x host with KVM is required");
|
||||
return g_test_run();
|
||||
}
|
||||
|
||||
tmpfs = g_dir_make_tmp("migration-test-XXXXXX", &err);
|
||||
if (!tmpfs) {
|
||||
g_test_message("Can't create temporary directory in %s: %s",
|
||||
|
@ -3466,6 +3446,31 @@ int main(int argc, char **argv)
|
|||
|
||||
module_call_init(MODULE_INIT_QOM);
|
||||
|
||||
migration_test_add("/migration/bad_dest", test_baddest);
|
||||
#ifndef _WIN32
|
||||
migration_test_add("/migration/analyze-script", test_analyze_script);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* On ppc64, the test only works with kvm-hv, but not with kvm-pr and TCG
|
||||
* is touchy due to race conditions on dirty bits (especially on PPC for
|
||||
* some reason)
|
||||
*/
|
||||
if (g_str_equal(arch, "ppc64") &&
|
||||
(!has_kvm || access("/sys/module/kvm_hv", F_OK))) {
|
||||
g_test_message("Skipping tests: kvm_hv not available");
|
||||
goto test_add_done;
|
||||
}
|
||||
|
||||
/*
|
||||
* Similar to ppc64, s390x seems to be touchy with TCG, so disable it
|
||||
* there until the problems are resolved
|
||||
*/
|
||||
if (g_str_equal(arch, "s390x") && !has_kvm) {
|
||||
g_test_message("Skipping tests: s390x host with KVM is required");
|
||||
goto test_add_done;
|
||||
}
|
||||
|
||||
if (is_x86) {
|
||||
migration_test_add("/migration/precopy/unix/suspend/live",
|
||||
test_precopy_unix_suspend_live);
|
||||
|
@ -3491,12 +3496,6 @@ int main(int argc, char **argv)
|
|||
}
|
||||
}
|
||||
|
||||
migration_test_add("/migration/bad_dest", test_baddest);
|
||||
#ifndef _WIN32
|
||||
if (!g_str_equal(arch, "s390x")) {
|
||||
migration_test_add("/migration/analyze-script", test_analyze_script);
|
||||
}
|
||||
#endif
|
||||
migration_test_add("/migration/precopy/unix/plain",
|
||||
test_precopy_unix_plain);
|
||||
migration_test_add("/migration/precopy/unix/xbzrle",
|
||||
|
@ -3653,6 +3652,8 @@ int main(int argc, char **argv)
|
|||
test_vcpu_dirty_limit);
|
||||
}
|
||||
|
||||
test_add_done:
|
||||
|
||||
ret = g_test_run();
|
||||
|
||||
g_assert_cmpint(ret, ==, 0);
|
||||
|
|
Loading…
Reference in New Issue