https://bugzilla.redhat.com/show_bug.cgi?id=1441662 when I was enhancing libvirt's guest CPU configuration code to be able to really ensure stable guest CPU ABI, I added a new attribute //cpu/@check which is nicely backward compatible... an old libvirt will just ignore it. However, even if check='full' will be ignored, an old libvirt will still see the updated CPU definition (features added or removed by the hypervisor will be shown there). And because we need QEMU 2.9.0 to check what features are going to be added or removed before we actually start the domain, migrating such domain to an older libvirt or QEMU may fail if QEMU enables a feature which is not supported by the host CPU. Known features causing problems are, e.g., x2apic, hypervisor, and arat. To make things even worse, updating a CPU definition with the automatically added/removed features can be done since QEMU 1.5.0. Even save/restore or snapshot revert on a single host running new libvirt and QEMU < 2.9.0 is now affected by this regression. This series fixes the regression by storing the original guest CPU definition in migratable XML and sending the updated CPU in a side channel (a migration or save cookie). Jiri Denemark (15): conf: Make error reporting in virCPUDefIsEqual optional conf: Refactor virCPUDefParseXML conf: Make virDomainSnapshotDefFormat easier to read conf: Pass xmlopt to virDomainSnapshotDefFormat qemu: Rename xml_len in virQEMUSaveHeader as data_len qemu: Refactor save image header conf: Introduce virSaveCookie conf: Add save cookie callbacks to xmlopt qemu: Implement virSaveCookie object and callbacks qemu: Store save cookie in save images and snapshots qemu: Remember CPU def from domain start qemu: Report the original CPU in migratable xml qemu: Send updated CPU in migration cookie qemu: Store updated CPU in save cookie qemu: Use updated CPU when starting QEMU if possible docs/formatsnapshot.html.in | 6 + docs/schemas/domainsnapshot.rng | 7 + po/POTFILES.in | 1 + src/Makefile.am | 1 + src/bhyve/bhyve_domain.c | 2 +- src/conf/cpu_conf.c | 224 +++++++++++-------- src/conf/cpu_conf.h | 12 +- src/conf/domain_conf.c | 30 ++- src/conf/domain_conf.h | 7 +- src/conf/snapshot_conf.c | 40 +++- src/conf/snapshot_conf.h | 3 + src/conf/virsavecookie.c | 144 ++++++++++++ src/conf/virsavecookie.h | 62 +++++ src/cpu/cpu.c | 5 +- src/esx/esx_driver.c | 2 +- src/libvirt_private.syms | 10 + src/libxl/libxl_conf.c | 2 +- src/lxc/lxc_conf.c | 2 +- src/openvz/openvz_driver.c | 2 +- src/phyp/phyp_driver.c | 2 +- src/qemu/qemu_capabilities.c | 2 +- src/qemu/qemu_conf.c | 3 +- src/qemu/qemu_domain.c | 207 +++++++++++++++-- src/qemu/qemu_domain.h | 22 ++ src/qemu/qemu_driver.c | 459 ++++++++++++++++++++++++++------------ src/qemu/qemu_migration.c | 18 +- src/qemu/qemu_migration_cookie.c | 31 ++- src/qemu/qemu_migration_cookie.h | 5 + src/qemu/qemu_process.c | 37 ++- src/qemu/qemu_process.h | 2 + src/security/virt-aa-helper.c | 2 +- src/test/test_driver.c | 3 +- src/uml/uml_driver.c | 2 +- src/vbox/vbox_common.c | 6 +- src/vmware/vmware_driver.c | 3 +- src/vmx/vmx.c | 2 +- src/vz/vz_driver.c | 3 +- src/xen/xen_driver.c | 2 +- src/xenapi/xenapi_driver.c | 2 +- tests/bhyveargv2xmltest.c | 2 +- tests/cputest.c | 5 +- tests/domainsnapshotxml2xmltest.c | 1 + tests/testutils.c | 2 +- 43 files changed, 1069 insertions(+), 316 deletions(-) create mode 100644 src/conf/virsavecookie.c create mode 100644 src/conf/virsavecookie.h -- 2.13.0 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list