When starting a domain with custom guest CPU specification QEMU may add
or remove some CPU features. There are several reasons for this, e.g.,
QEMU/KVM does not support some requested features or the definition of
the requested CPU model in libvirt's cpu_map.xml differs from the one
QEMU is using. We can't really avoid this because CPU models are allowed
to change with machine types and libvirt doesn't know (and probably
doesn't even want to know) about such changes.
Thus when we want to make sure guest ABI doesn't change when a domain
gets migrated to another host, we need to update our live CPU definition
according to the CPU QEMU created. Once updated, we will change CPU
checking to VIR_CPU_CHECK_FULL to make sure the virtual CPU created
after migration exactly matches the one on the source.
https://bugzilla.redhat.com/show_bug.cgi?id=822148
https://bugzilla.redhat.com/show_bug.cgi?id=824989
Jiri Denemark (12):
tests: Switch to sparse initialization of virCPUDef
docs: Clarify /domain/cpu/@match description
Introduce /domain/cpu/@check XML attribute
qemu: Set default values for CPU check attribute
qemu: Refactor Hyper-V features check
qemu: Refactor KVM features check
qemu: Refactor CPU features check
qemu: Refactor qemuProcessVerifyGuestCPU
qemu: Use ARCH_IS_X86 in qemuMonitorJSONGetGuestCPU
qemu: Ask QEMU for filtered CPU features
qemu: Update CPU definition according to QEMU
qemu: Enforce guest CPU specification
docs/formatdomain.html.in | 52 ++++-
docs/schemas/cputypes.rng | 10 +
docs/schemas/domaincommon.rng | 3 +
src/conf/cpu_conf.c | 30 +++
src/conf/cpu_conf.h | 12 ++
src/conf/domain_conf.c | 21 ++
src/cpu/cpu.c | 45 +++++
src/cpu/cpu.h | 12 ++
src/cpu/cpu_x86.c | 105 ++++++++++
src/libvirt_private.syms | 1 +
src/qemu/qemu_domain.c | 42 ++++
src/qemu/qemu_monitor.c | 11 +-
src/qemu/qemu_monitor.h | 3 +-
src/qemu/qemu_monitor_json.c | 38 +++-
src/qemu/qemu_monitor_json.h | 3 +-
src/qemu/qemu_process.c | 225 +++++++++++++--------
tests/domaincapstest.c | 38 ++--
tests/qemumonitorjsontest.c | 4 +-
.../qemuxml2argv-aarch64-gic-host.xml | 2 +-
.../qemuxml2argv-aarch64-gic-v2.xml | 2 +-
.../qemuxml2argv-aarch64-gic-v3.xml | 2 +-
.../qemuxml2argv-cpu-check-default-none.args | 21 ++
.../qemuxml2argv-cpu-check-default-none.xml | 19 ++
.../qemuxml2argv-cpu-check-default-none2.args | 21 ++
.../qemuxml2argv-cpu-check-default-none2.xml | 21 ++
.../qemuxml2argv-cpu-check-default-partial.args | 22 ++
.../qemuxml2argv-cpu-check-default-partial.xml | 19 ++
.../qemuxml2argv-cpu-check-default-partial2.args | 21 ++
.../qemuxml2argv-cpu-check-default-partial2.xml | 21 ++
.../qemuxml2argv-cpu-check-full.args | 1 +
.../qemuxml2argv-cpu-check-full.xml | 21 ++
.../qemuxml2argv-cpu-check-none.args | 21 ++
.../qemuxml2argv-cpu-check-none.xml | 21 ++
.../qemuxml2argv-cpu-check-partial.args | 1 +
.../qemuxml2argv-cpu-check-partial.xml | 21 ++
tests/qemuxml2argvtest.c | 8 +
.../qemuxml2xmlout-aarch64-aavmf-virtio-mmio.xml | 2 +-
...qemuxml2xmlout-aarch64-video-virtio-gpu-pci.xml | 2 +-
.../qemuxml2xmlout-aarch64-virtio-pci-default.xml | 2 +-
...2xmlout-aarch64-virtio-pci-manual-addresses.xml | 2 +-
.../qemuxml2xmlout-cpu-check-default-none.xml | 28 +++
.../qemuxml2xmlout-cpu-check-default-none2.xml | 30 +++
.../qemuxml2xmlout-cpu-check-default-partial.xml | 30 +++
.../qemuxml2xmlout-cpu-check-default-partial2.xml | 30 +++
.../qemuxml2xmlout-cpu-check-full.xml | 30 +++
.../qemuxml2xmlout-cpu-check-none.xml | 30 +++
.../qemuxml2xmlout-cpu-check-partial.xml | 30 +++
.../qemuxml2xmlout-cpu-eoi-disabled.xml | 2 +-
.../qemuxml2xmlout-cpu-eoi-enabled.xml | 2 +-
.../qemuxml2xmlout-cpu-host-kvmclock.xml | 2 +-
.../qemuxml2xmlout-cpu-host-model-features.xml | 2 +-
...emuxml2xmlout-cpu-host-passthrough-features.xml | 2 +-
.../qemuxml2xmlout-cpu-kvmclock.xml | 2 +-
.../qemuxml2xmlout-graphics-spice-timeout.xml | 2 +-
tests/qemuxml2xmltest.c | 8 +
tests/testutilsqemu.c | 48 ++---
56 files changed, 1039 insertions(+), 167 deletions(-)
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cpu-check-default-none.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cpu-check-default-none.xml
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cpu-check-default-none2.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cpu-check-default-none2.xml
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cpu-check-default-partial.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cpu-check-default-partial.xml
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cpu-check-default-partial2.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cpu-check-default-partial2.xml
create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-cpu-check-full.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cpu-check-full.xml
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cpu-check-none.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cpu-check-none.xml
create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-cpu-check-partial.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cpu-check-partial.xml
create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-cpu-check-default-none.xml
create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-cpu-check-default-none2.xml
create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-cpu-check-default-partial.xml
create mode 100644
tests/qemuxml2xmloutdata/qemuxml2xmlout-cpu-check-default-partial2.xml
create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-cpu-check-full.xml
create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-cpu-check-none.xml
create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-cpu-check-partial.xml
--
2.12.0