diff --git a/libvirt-cpu_conf-Make-virCPUDefFilterFeatures-return-void.patch b/libvirt-cpu_conf-Make-virCPUDefFilterFeatures-return-void.patch new file mode 100644 index 0000000..5a764e4 --- /dev/null +++ b/libvirt-cpu_conf-Make-virCPUDefFilterFeatures-return-void.patch @@ -0,0 +1,138 @@ +From 252b9913dc3e15696e89ce10ad3b61f78fe3c63a Mon Sep 17 00:00:00 2001 +Message-ID: <252b9913dc3e15696e89ce10ad3b61f78fe3c63a.1763729878.git.jdenemar@redhat.com> +From: Jiri Denemark +Date: Fri, 24 Oct 2025 15:07:45 +0200 +Subject: [PATCH] cpu_conf: Make virCPUDefFilterFeatures return void +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The only thing that can fail inside virCPUDefFilterFeatures is +VIR_DELETE_ELEMENT_INPLACE macro. The macro just calls +virDeleteElementsN, which reports a warning when all elements to be +removed are not within the array bounds and returns -1. The function +succeeds otherwise. But since VIR_DELETE_ELEMENT_INPLACE sets the number +of elements to be removed to 1 and we call it with i < cpu->nfeatures, +the safety check in virDeleteElementsN will never fail. And even if we +theoretically called it with wrong arguments, it just wouldn't do +anything. + +Thus we can safely assume VIR_DELETE_ELEMENT_INPLACE always succeeds in +virCPUDefFilterFeatures and avoid reporting any errors to simplify +callers. + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit fd6cf1b44accd1856a4611933ad51c0e04221aaa) + +https://issues.redhat.com/browse/RHEL-126094 +Signed-off-by: Jiri Denemark +--- + src/conf/cpu_conf.c | 9 ++++----- + src/conf/cpu_conf.h | 2 +- + src/qemu/qemu_capabilities.c | 15 ++++++--------- + src/qemu/qemu_domain.c | 3 +-- + src/qemu/qemu_process.c | 5 ++--- + 5 files changed, 14 insertions(+), 20 deletions(-) + +diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c +index 31425783ba..7aeedf64f5 100644 +--- a/src/conf/cpu_conf.c ++++ b/src/conf/cpu_conf.c +@@ -1017,7 +1017,7 @@ virCPUDefListExplicitFeatures(const virCPUDef *def) + } + + +-int ++void + virCPUDefFilterFeatures(virCPUDef *cpu, + virCPUDefFeatureFilter filter, + void *opaque) +@@ -1031,11 +1031,10 @@ virCPUDefFilterFeatures(virCPUDef *cpu, + } + + VIR_FREE(cpu->features[i].name); +- if (VIR_DELETE_ELEMENT_INPLACE(cpu->features, i, cpu->nfeatures) < 0) +- return -1; +- } + +- return 0; ++ /* Safe to ignore as an error is returned only for invalid arguments */ ++ ignore_value(VIR_DELETE_ELEMENT_INPLACE(cpu->features, i, cpu->nfeatures)); ++ } + } + + +diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h +index 28e26303ef..cfb8f1a461 100644 +--- a/src/conf/cpu_conf.h ++++ b/src/conf/cpu_conf.h +@@ -260,7 +260,7 @@ virCPUFeatureDef * + virCPUDefFindFeature(const virCPUDef *def, + const char *name); + +-int ++void + virCPUDefFilterFeatures(virCPUDef *cpu, + virCPUDefFeatureFilter filter, + void *opaque); +diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c +index d2b59ba1f4..a394bae754 100644 +--- a/src/qemu/qemu_capabilities.c ++++ b/src/qemu/qemu_capabilities.c +@@ -4048,17 +4048,14 @@ virQEMUCapsInitHostCPUModel(virQEMUCaps *qemuCaps, + + if (ARCH_IS_X86(qemuCaps->arch) && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_CPU_UNAVAILABLE_FEATURES)) { +- if (cpu && +- virCPUDefFilterFeatures(cpu, virCPUx86FeatureFilterDropMSR, NULL) < 0) +- goto error; ++ if (cpu) ++ virCPUDefFilterFeatures(cpu, virCPUx86FeatureFilterDropMSR, NULL); + +- if (migCPU && +- virCPUDefFilterFeatures(migCPU, virCPUx86FeatureFilterDropMSR, NULL) < 0) +- goto error; ++ if (migCPU) ++ virCPUDefFilterFeatures(migCPU, virCPUx86FeatureFilterDropMSR, NULL); + +- if (fullCPU && +- virCPUDefFilterFeatures(fullCPU, virCPUx86FeatureFilterDropMSR, NULL) < 0) +- goto error; ++ if (fullCPU) ++ virCPUDefFilterFeatures(fullCPU, virCPUx86FeatureFilterDropMSR, NULL); + } + + if (virQEMUCapsTypeIsAccelerated(type)) +diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c +index ddc065d8f4..852ff34303 100644 +--- a/src/qemu/qemu_domain.c ++++ b/src/qemu/qemu_domain.c +@@ -5169,8 +5169,7 @@ qemuDomainMakeCPUMigratable(virArch arch, + g_auto(GStrv) keep = virCPUDefListExplicitFeatures(origCPU); + data.keep = keep; + +- if (virCPUDefFilterFeatures(cpu, qemuDomainDropAddedCPUFeatures, &data) < 0) +- return -1; ++ virCPUDefFilterFeatures(cpu, qemuDomainDropAddedCPUFeatures, &data); + } + } + +diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c +index 3a6ea44c8b..24af907afb 100644 +--- a/src/qemu/qemu_process.c ++++ b/src/qemu/qemu_process.c +@@ -6532,9 +6532,8 @@ qemuProcessUpdateGuestCPU(virDomainDef *def, + def->cpu->fallback = VIR_CPU_FALLBACK_FORBID; + } + +- if (virCPUDefFilterFeatures(def->cpu, virQEMUCapsCPUFilterFeatures, +- &def->os.arch) < 0) +- return -1; ++ virCPUDefFilterFeatures(def->cpu, virQEMUCapsCPUFilterFeatures, ++ &def->os.arch); + + if (def->cpu->deprecated_feats && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION_DEPRECATED_PROPS)) { +-- +2.51.1 diff --git a/libvirt-qemu-Ignore-ht-CPU-feature.patch b/libvirt-qemu-Ignore-ht-CPU-feature.patch new file mode 100644 index 0000000..58e1fbf --- /dev/null +++ b/libvirt-qemu-Ignore-ht-CPU-feature.patch @@ -0,0 +1,290 @@ +From be89e50ce38423980564b93321a9fe075b8c69b5 Mon Sep 17 00:00:00 2001 +Message-ID: +From: Jiri Denemark +Date: Fri, 24 Oct 2025 14:17:56 +0200 +Subject: [PATCH] qemu: Ignore "ht" CPU feature +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The feature does not do anything, QEMU will always set it according to +the CPU topology completely ignoring what we asked for. Unfortunately, +the way the state of "ht" is reported changed in QEMU 10.0.0 (commit +c6bd2dd634208). + +QEMU older than 10.0.0 would just report whatever was specified on the +command line totally ignoring the actual state of the feature visible to +a guest. But after the change QEMU reports ht=on in case it enabled "ht" +based on the CPU topology. In all other cases QEMU still reports the +state requested on the command line. + +As a result of this change a domain with multiple CPU threads started on +QEMU < 10.0.0 could not be migrated to QEMU >= 10.0.0 unless "ht" was +explicitly enabled in the domain XML because libvirt would see "ht" +enabled on the destination, but disabled on the source (the guest would +see "ht" enabled in both cases anyway). Outgoing migration of domains +started on QEMU >= 10.0.0 is not affected. + +To fix this issue we can completely ignore "ht" both in the domain XML +and in the CPU properties reported by QEMU. With this fix incoming +migration to QEMU >= 10.0.0 works again. + +Fixes: https://gitlab.com/libvirt/libvirt/-/issues/821 +Fixes: https://issues.redhat.com/browse/RHEL-104216 +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit ba16113c76050a10bbccaae0192a0d30f97de5ae) + +https://issues.redhat.com/browse/RHEL-126094 + +Signed-off-by: Jiri Denemark +--- + src/qemu/qemu_capabilities.c | 1 + + tests/qemuxmlconfdata/cpu-cache-disable3.x86_64-latest.args | 2 +- + .../cpu-check-default-partial.x86_64-latest.args | 2 +- + tests/qemuxmlconfdata/cpu-exact2-nofallback.x86_64-latest.args | 2 +- + tests/qemuxmlconfdata/cpu-exact2-nofallback.x86_64-latest.xml | 1 - + tests/qemuxmlconfdata/cpu-exact2-nofallback.xml | 1 - + tests/qemuxmlconfdata/cpu-exact2.x86_64-latest.args | 2 +- + tests/qemuxmlconfdata/cpu-exact2.x86_64-latest.xml | 1 - + tests/qemuxmlconfdata/cpu-exact2.xml | 1 - + tests/qemuxmlconfdata/cpu-host-model-cmt.x86_64-latest.args | 2 +- + tests/qemuxmlconfdata/cpu-host-model-vendor.x86_64-latest.args | 2 +- + tests/qemuxmlconfdata/cpu-minimum1.x86_64-latest.args | 2 +- + tests/qemuxmlconfdata/cpu-minimum2.x86_64-latest.args | 2 +- + tests/qemuxmlconfdata/cpu-phys-bits-emulate2.x86_64-latest.args | 2 +- + tests/qemuxmlconfdata/cpu-strict1.x86_64-latest.args | 2 +- + tests/qemuxmlconfdata/cpu-strict1.x86_64-latest.xml | 1 - + tests/qemuxmlconfdata/cpu-strict1.xml | 1 - + tests/qemuxmlconfdata/cpu-tsc-frequency.x86_64-latest.args | 2 +- + 18 files changed, 12 insertions(+), 17 deletions(-) + +diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c +index a394bae754..1b9dcb51b8 100644 +--- a/src/qemu/qemu_capabilities.c ++++ b/src/qemu/qemu_capabilities.c +@@ -3688,6 +3688,7 @@ const char *ignoredFeatures[] = { + "osxsave", "ospke", /* dropped from QEMU */ + "vmx-ept-uc", "vmx-ept-wb", /* never supported by QEMU */ + "vmx-invvpid-single-context", /* never supported by QEMU */ ++ "ht", /* ignored by QEMU, set according to topology */ + }; + + bool +diff --git a/tests/qemuxmlconfdata/cpu-cache-disable3.x86_64-latest.args b/tests/qemuxmlconfdata/cpu-cache-disable3.x86_64-latest.args +index 4adf20b55a..1e962589c9 100644 +--- a/tests/qemuxmlconfdata/cpu-cache-disable3.x86_64-latest.args ++++ b/tests/qemuxmlconfdata/cpu-cache-disable3.x86_64-latest.args +@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-foo/.config \ + -object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-foo/master-key.aes"}' \ + -machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \ + -accel kvm \ +--cpu Haswell,vme=on,ds=on,acpi=on,ss=on,ht=on,tm=on,pbe=on,dtes64=on,monitor=on,ds-cpl=on,vmx=on,smx=on,est=on,tm2=on,xtpr=on,pdcm=on,f16c=on,rdrand=on,pdpe1gb=on,abm=on,lahf-lm=on,l3-cache=off \ ++-cpu Haswell,vme=on,ds=on,acpi=on,ss=on,tm=on,pbe=on,dtes64=on,monitor=on,ds-cpl=on,vmx=on,smx=on,est=on,tm2=on,xtpr=on,pdcm=on,f16c=on,rdrand=on,pdpe1gb=on,abm=on,lahf-lm=on,l3-cache=off \ + -m size=219136k \ + -object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ + -overcommit mem-lock=off \ +diff --git a/tests/qemuxmlconfdata/cpu-check-default-partial.x86_64-latest.args b/tests/qemuxmlconfdata/cpu-check-default-partial.x86_64-latest.args +index a92da44bd8..fe553fd31b 100644 +--- a/tests/qemuxmlconfdata/cpu-check-default-partial.x86_64-latest.args ++++ b/tests/qemuxmlconfdata/cpu-check-default-partial.x86_64-latest.args +@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ + -object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \ + -machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \ + -accel kvm \ +--cpu Haswell,vme=on,ds=on,acpi=on,ss=on,ht=on,tm=on,pbe=on,dtes64=on,monitor=on,ds-cpl=on,vmx=on,smx=on,est=on,tm2=on,xtpr=on,pdcm=on,f16c=on,rdrand=on,pdpe1gb=on,abm=on,lahf-lm=on \ ++-cpu Haswell,vme=on,ds=on,acpi=on,ss=on,tm=on,pbe=on,dtes64=on,monitor=on,ds-cpl=on,vmx=on,smx=on,est=on,tm2=on,xtpr=on,pdcm=on,f16c=on,rdrand=on,pdpe1gb=on,abm=on,lahf-lm=on \ + -m size=219136k \ + -object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ + -overcommit mem-lock=off \ +diff --git a/tests/qemuxmlconfdata/cpu-exact2-nofallback.x86_64-latest.args b/tests/qemuxmlconfdata/cpu-exact2-nofallback.x86_64-latest.args +index 20b0306268..7464609aba 100644 +--- a/tests/qemuxmlconfdata/cpu-exact2-nofallback.x86_64-latest.args ++++ b/tests/qemuxmlconfdata/cpu-exact2-nofallback.x86_64-latest.args +@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ + -object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \ + -machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \ + -accel kvm \ +--cpu core2duo,ds=on,ht=on,tm=on,ds-cpl=on,xtpr=on,3dnowext=on,lahf-lm=on,nx=off,cx16=off,tm2=off,pbe=off,ss=off,sse4a=off,wdt=off \ ++-cpu core2duo,ds=on,tm=on,ds-cpl=on,xtpr=on,3dnowext=on,lahf-lm=on,nx=off,cx16=off,tm2=off,pbe=off,ss=off,sse4a=off,wdt=off \ + -m size=219136k \ + -object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ + -overcommit mem-lock=off \ +diff --git a/tests/qemuxmlconfdata/cpu-exact2-nofallback.x86_64-latest.xml b/tests/qemuxmlconfdata/cpu-exact2-nofallback.x86_64-latest.xml +index d66d0a182b..05c78334ab 100644 +--- a/tests/qemuxmlconfdata/cpu-exact2-nofallback.x86_64-latest.xml ++++ b/tests/qemuxmlconfdata/cpu-exact2-nofallback.x86_64-latest.xml +@@ -11,7 +11,6 @@ + + core2duo + +- + + + +diff --git a/tests/qemuxmlconfdata/cpu-exact2-nofallback.xml b/tests/qemuxmlconfdata/cpu-exact2-nofallback.xml +index 4cd1d18216..d7c3e4f40f 100644 +--- a/tests/qemuxmlconfdata/cpu-exact2-nofallback.xml ++++ b/tests/qemuxmlconfdata/cpu-exact2-nofallback.xml +@@ -11,7 +11,6 @@ + + core2duo + +- + + + +diff --git a/tests/qemuxmlconfdata/cpu-exact2.x86_64-latest.args b/tests/qemuxmlconfdata/cpu-exact2.x86_64-latest.args +index 20b0306268..7464609aba 100644 +--- a/tests/qemuxmlconfdata/cpu-exact2.x86_64-latest.args ++++ b/tests/qemuxmlconfdata/cpu-exact2.x86_64-latest.args +@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ + -object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \ + -machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \ + -accel kvm \ +--cpu core2duo,ds=on,ht=on,tm=on,ds-cpl=on,xtpr=on,3dnowext=on,lahf-lm=on,nx=off,cx16=off,tm2=off,pbe=off,ss=off,sse4a=off,wdt=off \ ++-cpu core2duo,ds=on,tm=on,ds-cpl=on,xtpr=on,3dnowext=on,lahf-lm=on,nx=off,cx16=off,tm2=off,pbe=off,ss=off,sse4a=off,wdt=off \ + -m size=219136k \ + -object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ + -overcommit mem-lock=off \ +diff --git a/tests/qemuxmlconfdata/cpu-exact2.x86_64-latest.xml b/tests/qemuxmlconfdata/cpu-exact2.x86_64-latest.xml +index 7dccf6902c..cf9d241372 100644 +--- a/tests/qemuxmlconfdata/cpu-exact2.x86_64-latest.xml ++++ b/tests/qemuxmlconfdata/cpu-exact2.x86_64-latest.xml +@@ -11,7 +11,6 @@ + + core2duo + +- + + + +diff --git a/tests/qemuxmlconfdata/cpu-exact2.xml b/tests/qemuxmlconfdata/cpu-exact2.xml +index 4239796f31..b4800262f6 100644 +--- a/tests/qemuxmlconfdata/cpu-exact2.xml ++++ b/tests/qemuxmlconfdata/cpu-exact2.xml +@@ -11,7 +11,6 @@ + + core2duo + +- + + + +diff --git a/tests/qemuxmlconfdata/cpu-host-model-cmt.x86_64-latest.args b/tests/qemuxmlconfdata/cpu-host-model-cmt.x86_64-latest.args +index 510e19bba6..d6b57d40a3 100644 +--- a/tests/qemuxmlconfdata/cpu-host-model-cmt.x86_64-latest.args ++++ b/tests/qemuxmlconfdata/cpu-host-model-cmt.x86_64-latest.args +@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ + -object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \ + -machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \ + -accel tcg \ +--cpu Haswell,vme=on,ds=on,acpi=on,ss=on,ht=on,tm=on,pbe=on,dtes64=on,monitor=on,ds-cpl=on,vmx=on,smx=on,est=on,tm2=on,xtpr=on,pdcm=on,f16c=on,rdrand=on,pdpe1gb=on,abm=on,lahf-lm=on \ ++-cpu Haswell,vme=on,ds=on,acpi=on,ss=on,tm=on,pbe=on,dtes64=on,monitor=on,ds-cpl=on,vmx=on,smx=on,est=on,tm2=on,xtpr=on,pdcm=on,f16c=on,rdrand=on,pdpe1gb=on,abm=on,lahf-lm=on \ + -m size=219136k \ + -object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ + -overcommit mem-lock=off \ +diff --git a/tests/qemuxmlconfdata/cpu-host-model-vendor.x86_64-latest.args b/tests/qemuxmlconfdata/cpu-host-model-vendor.x86_64-latest.args +index c258a1ab36..ef7d442d5b 100644 +--- a/tests/qemuxmlconfdata/cpu-host-model-vendor.x86_64-latest.args ++++ b/tests/qemuxmlconfdata/cpu-host-model-vendor.x86_64-latest.args +@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ + -object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \ + -machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \ + -accel tcg \ +--cpu 'Haswell,vendor=Libvirt QEMU,vme=on,ds=on,acpi=on,ss=on,ht=on,tm=on,pbe=on,dtes64=on,monitor=on,ds-cpl=on,vmx=on,smx=on,est=on,tm2=on,xtpr=on,pdcm=on,f16c=on,rdrand=on,pdpe1gb=on,abm=on,lahf-lm=on' \ ++-cpu 'Haswell,vendor=Libvirt QEMU,vme=on,ds=on,acpi=on,ss=on,tm=on,pbe=on,dtes64=on,monitor=on,ds-cpl=on,vmx=on,smx=on,est=on,tm2=on,xtpr=on,pdcm=on,f16c=on,rdrand=on,pdpe1gb=on,abm=on,lahf-lm=on' \ + -m size=219136k \ + -object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ + -overcommit mem-lock=off \ +diff --git a/tests/qemuxmlconfdata/cpu-minimum1.x86_64-latest.args b/tests/qemuxmlconfdata/cpu-minimum1.x86_64-latest.args +index a92da44bd8..fe553fd31b 100644 +--- a/tests/qemuxmlconfdata/cpu-minimum1.x86_64-latest.args ++++ b/tests/qemuxmlconfdata/cpu-minimum1.x86_64-latest.args +@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ + -object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \ + -machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \ + -accel kvm \ +--cpu Haswell,vme=on,ds=on,acpi=on,ss=on,ht=on,tm=on,pbe=on,dtes64=on,monitor=on,ds-cpl=on,vmx=on,smx=on,est=on,tm2=on,xtpr=on,pdcm=on,f16c=on,rdrand=on,pdpe1gb=on,abm=on,lahf-lm=on \ ++-cpu Haswell,vme=on,ds=on,acpi=on,ss=on,tm=on,pbe=on,dtes64=on,monitor=on,ds-cpl=on,vmx=on,smx=on,est=on,tm2=on,xtpr=on,pdcm=on,f16c=on,rdrand=on,pdpe1gb=on,abm=on,lahf-lm=on \ + -m size=219136k \ + -object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ + -overcommit mem-lock=off \ +diff --git a/tests/qemuxmlconfdata/cpu-minimum2.x86_64-latest.args b/tests/qemuxmlconfdata/cpu-minimum2.x86_64-latest.args +index 62e0101568..ddd0c64080 100644 +--- a/tests/qemuxmlconfdata/cpu-minimum2.x86_64-latest.args ++++ b/tests/qemuxmlconfdata/cpu-minimum2.x86_64-latest.args +@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ + -object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \ + -machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \ + -accel kvm \ +--cpu Haswell,vme=on,ds=on,acpi=on,ss=on,ht=on,tm=on,pbe=on,dtes64=on,monitor=on,ds-cpl=on,vmx=on,smx=on,est=on,tm2=on,xtpr=on,pdcm=on,f16c=on,rdrand=on,pdpe1gb=on,abm=on,lahf-lm=on,syscall=off,nx=off,lm=off,svm=off \ ++-cpu Haswell,vme=on,ds=on,acpi=on,ss=on,tm=on,pbe=on,dtes64=on,monitor=on,ds-cpl=on,vmx=on,smx=on,est=on,tm2=on,xtpr=on,pdcm=on,f16c=on,rdrand=on,pdpe1gb=on,abm=on,lahf-lm=on,syscall=off,nx=off,lm=off,svm=off \ + -m size=219136k \ + -object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ + -overcommit mem-lock=off \ +diff --git a/tests/qemuxmlconfdata/cpu-phys-bits-emulate2.x86_64-latest.args b/tests/qemuxmlconfdata/cpu-phys-bits-emulate2.x86_64-latest.args +index 92c719b553..3808af7399 100644 +--- a/tests/qemuxmlconfdata/cpu-phys-bits-emulate2.x86_64-latest.args ++++ b/tests/qemuxmlconfdata/cpu-phys-bits-emulate2.x86_64-latest.args +@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-foo/.config \ + -object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-foo/master-key.aes"}' \ + -machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \ + -accel kvm \ +--cpu Haswell,vme=on,ds=on,acpi=on,ss=on,ht=on,tm=on,pbe=on,dtes64=on,monitor=on,ds-cpl=on,vmx=on,smx=on,est=on,tm2=on,xtpr=on,pdcm=on,f16c=on,rdrand=on,pdpe1gb=on,abm=on,lahf-lm=on,phys-bits=42 \ ++-cpu Haswell,vme=on,ds=on,acpi=on,ss=on,tm=on,pbe=on,dtes64=on,monitor=on,ds-cpl=on,vmx=on,smx=on,est=on,tm2=on,xtpr=on,pdcm=on,f16c=on,rdrand=on,pdpe1gb=on,abm=on,lahf-lm=on,phys-bits=42 \ + -m size=219136k \ + -object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ + -overcommit mem-lock=off \ +diff --git a/tests/qemuxmlconfdata/cpu-strict1.x86_64-latest.args b/tests/qemuxmlconfdata/cpu-strict1.x86_64-latest.args +index 3f9c3516bb..7e870db393 100644 +--- a/tests/qemuxmlconfdata/cpu-strict1.x86_64-latest.args ++++ b/tests/qemuxmlconfdata/cpu-strict1.x86_64-latest.args +@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ + -object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \ + -machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \ + -accel kvm \ +--cpu Haswell,ds=on,acpi=on,ht=on,tm=on,ds-cpl=on,vmx=on,est=on,xtpr=on,3dnowext=on,lahf-lm=on,nx=off,cx16=off,tm2=off,pbe=off,ss=off,sse4a=off,wdt=off,vme=off,invtsc=off,abm=off,pdpe1gb=off,rdrand=off,f16c=off,pdcm=off,smx=off,monitor=off,dtes64=off \ ++-cpu Haswell,ds=on,acpi=on,tm=on,ds-cpl=on,vmx=on,est=on,xtpr=on,3dnowext=on,lahf-lm=on,nx=off,cx16=off,tm2=off,pbe=off,ss=off,sse4a=off,wdt=off,vme=off,invtsc=off,abm=off,pdpe1gb=off,rdrand=off,f16c=off,pdcm=off,smx=off,monitor=off,dtes64=off \ + -m size=219136k \ + -object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ + -overcommit mem-lock=off \ +diff --git a/tests/qemuxmlconfdata/cpu-strict1.x86_64-latest.xml b/tests/qemuxmlconfdata/cpu-strict1.x86_64-latest.xml +index beeaf5c682..9c5e083aee 100644 +--- a/tests/qemuxmlconfdata/cpu-strict1.x86_64-latest.xml ++++ b/tests/qemuxmlconfdata/cpu-strict1.x86_64-latest.xml +@@ -12,7 +12,6 @@ + Haswell + + +- + + + +diff --git a/tests/qemuxmlconfdata/cpu-strict1.xml b/tests/qemuxmlconfdata/cpu-strict1.xml +index 63db54ecad..c0548b3dca 100644 +--- a/tests/qemuxmlconfdata/cpu-strict1.xml ++++ b/tests/qemuxmlconfdata/cpu-strict1.xml +@@ -12,7 +12,6 @@ + Haswell + + +- + + + +diff --git a/tests/qemuxmlconfdata/cpu-tsc-frequency.x86_64-latest.args b/tests/qemuxmlconfdata/cpu-tsc-frequency.x86_64-latest.args +index 4353d65ac2..e926d309f5 100644 +--- a/tests/qemuxmlconfdata/cpu-tsc-frequency.x86_64-latest.args ++++ b/tests/qemuxmlconfdata/cpu-tsc-frequency.x86_64-latest.args +@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ + -object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \ + -machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \ + -accel kvm \ +--cpu Haswell,vme=on,ds=on,acpi=on,ss=on,ht=on,tm=on,pbe=on,dtes64=on,monitor=on,ds-cpl=on,vmx=on,smx=on,est=on,tm2=on,xtpr=on,pdcm=on,f16c=on,rdrand=on,pdpe1gb=on,abm=on,lahf-lm=on,invtsc=on,tsc-frequency=4567890000 \ ++-cpu Haswell,vme=on,ds=on,acpi=on,ss=on,tm=on,pbe=on,dtes64=on,monitor=on,ds-cpl=on,vmx=on,smx=on,est=on,tm2=on,xtpr=on,pdcm=on,f16c=on,rdrand=on,pdpe1gb=on,abm=on,lahf-lm=on,invtsc=on,tsc-frequency=4567890000 \ + -m size=219136k \ + -object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ + -overcommit mem-lock=off \ +-- +2.51.1 diff --git a/libvirt-qemu_domain-Fix-qemuDomainFixupCPUs.patch b/libvirt-qemu_domain-Fix-qemuDomainFixupCPUs.patch new file mode 100644 index 0000000..99684a5 --- /dev/null +++ b/libvirt-qemu_domain-Fix-qemuDomainFixupCPUs.patch @@ -0,0 +1,74 @@ +From 7d2418e14565d6f5786aa1dec41a40c2d0bec23d Mon Sep 17 00:00:00 2001 +Message-ID: <7d2418e14565d6f5786aa1dec41a40c2d0bec23d.1763729878.git.jdenemar@redhat.com> +From: Jiri Denemark +Date: Fri, 24 Oct 2025 15:27:03 +0200 +Subject: [PATCH] qemu_domain: Fix qemuDomainFixupCPUs +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The function was apparently created when the list of ignored CPU +features contained just cmt and related features. The list grew quite a +bit since then and this function stopped making sense as it would remove +all ignored features from CPU definitions but only if cmt was present. +The issue with cmt is long gone and this function was not really doing +anything. Surprisingly this didn't cause any real issues as we don't +update CPU definitions with features unknown to QEMU. But we may still +want to remove ignored features even though QEMU knows about them for +compatibility reasons. + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 2ab6925218df7298c17f0186425624aa792a5e84) + +https://issues.redhat.com/browse/RHEL-126094 +Signed-off-by: Jiri Denemark +--- + src/qemu/qemu_domain.c | 20 +++++++++++--------- + 1 file changed, 11 insertions(+), 9 deletions(-) + +diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c +index 219b857e95..be7f50b34e 100644 +--- a/src/qemu/qemu_domain.c ++++ b/src/qemu/qemu_domain.c +@@ -9467,15 +9467,20 @@ qemuDomainUpdateCPU(virDomainObj *vm, + + + /** +- * qemuDomainFixupCPUS: ++ * qemuDomainFixupCPUs: + * @vm: domain object + * @origCPU: original CPU used when the domain was started + * + * Libvirt older than 3.9.0 could have messed up the expansion of host-model + * CPU when reconnecting to a running domain by adding features QEMU does not +- * support (such as cmt). This API fixes both the actual CPU provided by QEMU +- * (stored in the domain object) and the @origCPU used when starting the +- * domain. ++ * support (such as cmt). ++ * ++ * Newer libvirt would not include feature unknown to QEMU, but the CPU ++ * definitions could contain features that were removed from QEMU and added to ++ * our list of ignored features as they were not actually doing anything. ++ * ++ * This API fixes both the actual CPU provided by QEMU (stored in the domain ++ * object) and the @origCPU used when starting the domain. + * + * This is safe even if the original CPU definition used mode='custom' (rather + * than host-model) since we know QEMU was able to start the domain and thus +@@ -9505,11 +9510,8 @@ qemuDomainFixupCPUs(virDomainObj *vm, + if (!origCPU) + return; + +- if (virCPUDefFindFeature(vm->def->cpu, "cmt")) +- virCPUDefFilterFeatures(vm->def->cpu, virQEMUCapsCPUFilterFeatures, &arch); +- +- if (virCPUDefFindFeature(origCPU, "cmt")) +- virCPUDefFilterFeatures(origCPU, virQEMUCapsCPUFilterFeatures, &arch); ++ virCPUDefFilterFeatures(vm->def->cpu, virQEMUCapsCPUFilterFeatures, &arch); ++ virCPUDefFilterFeatures(origCPU, virQEMUCapsCPUFilterFeatures, &arch); + } + + +-- +2.51.1 diff --git a/libvirt-qemu_domain-Simplify-qemuDomainFixupCPUs.patch b/libvirt-qemu_domain-Simplify-qemuDomainFixupCPUs.patch new file mode 100644 index 0000000..ef454e7 --- /dev/null +++ b/libvirt-qemu_domain-Simplify-qemuDomainFixupCPUs.patch @@ -0,0 +1,108 @@ +From b95e494f61c603876875cda69ce0dcbe77918fa8 Mon Sep 17 00:00:00 2001 +Message-ID: +From: Jiri Denemark +Date: Fri, 24 Oct 2025 15:13:49 +0200 +Subject: [PATCH] qemu_domain: Simplify qemuDomainFixupCPUs +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Since virCPUDefFilterFeatures never fails, we can use it for in-place +modifications instead of modifying a temporary virCPUDef copy. + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit fbf44bc8cf63ab5c7641f1aa04aaf7fb5eaab62e) + +https://issues.redhat.com/browse/RHEL-126094 +Signed-off-by: Jiri Denemark +--- + src/qemu/qemu_domain.c | 26 ++++++-------------------- + src/qemu/qemu_domain.h | 2 +- + src/qemu/qemu_process.c | 4 ++-- + 3 files changed, 9 insertions(+), 23 deletions(-) + +diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c +index 852ff34303..219b857e95 100644 +--- a/src/qemu/qemu_domain.c ++++ b/src/qemu/qemu_domain.c +@@ -9486,7 +9486,7 @@ qemuDomainUpdateCPU(virDomainObj *vm, + */ + void + qemuDomainFixupCPUs(virDomainObj *vm, +- virCPUDef **origCPU) ++ virCPUDef *origCPU) + { + virArch arch = vm->def->os.arch; + +@@ -9502,28 +9502,14 @@ qemuDomainFixupCPUs(virDomainObj *vm, + * we asked for or libvirt was too old to mess up the translation from + * host-model. + */ +- if (!*origCPU) ++ if (!origCPU) + return; + +- if (virCPUDefFindFeature(vm->def->cpu, "cmt")) { +- g_autoptr(virCPUDef) fixedCPU = virCPUDefCopyWithoutModel(vm->def->cpu); ++ if (virCPUDefFindFeature(vm->def->cpu, "cmt")) ++ virCPUDefFilterFeatures(vm->def->cpu, virQEMUCapsCPUFilterFeatures, &arch); + +- virCPUDefCopyModelFilter(fixedCPU, vm->def->cpu, false, +- virQEMUCapsCPUFilterFeatures, &arch); +- +- virCPUDefFree(vm->def->cpu); +- vm->def->cpu = g_steal_pointer(&fixedCPU); +- } +- +- if (virCPUDefFindFeature(*origCPU, "cmt")) { +- g_autoptr(virCPUDef) fixedOrig = virCPUDefCopyWithoutModel(*origCPU); +- +- virCPUDefCopyModelFilter(fixedOrig, *origCPU, false, +- virQEMUCapsCPUFilterFeatures, &arch); +- +- virCPUDefFree(*origCPU); +- *origCPU = g_steal_pointer(&fixedOrig); +- } ++ if (virCPUDefFindFeature(origCPU, "cmt")) ++ virCPUDefFilterFeatures(origCPU, virQEMUCapsCPUFilterFeatures, &arch); + } + + +diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h +index 16e04829c4..dc0600a061 100644 +--- a/src/qemu/qemu_domain.h ++++ b/src/qemu/qemu_domain.h +@@ -996,7 +996,7 @@ qemuDomainUpdateCPU(virDomainObj *vm, + + void + qemuDomainFixupCPUs(virDomainObj *vm, +- virCPUDef **origCPU); ++ virCPUDef *origCPU); + + char * + qemuDomainGetMachineName(virDomainObj *vm); +diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c +index 24af907afb..192b015482 100644 +--- a/src/qemu/qemu_process.c ++++ b/src/qemu/qemu_process.c +@@ -8599,7 +8599,7 @@ qemuProcessStartWithMemoryState(virConnectPtr conn, + * the CPU definitions. + */ + if (cookie) +- qemuDomainFixupCPUs(vm, &cookie->cpu); ++ qemuDomainFixupCPUs(vm, cookie->cpu); + + if (cookie && !cookie->slirpHelper) + priv->disableSlirp = true; +@@ -9421,7 +9421,7 @@ qemuProcessRefreshCPU(virQEMUDriver *driver, + * case the host-model is known to not contain features which QEMU + * doesn't know about. + */ +- qemuDomainFixupCPUs(vm, &priv->origCPU); ++ qemuDomainFixupCPUs(vm, priv->origCPU); + } + + return 0; +-- +2.51.1 diff --git a/libvirt-qemu_monitor-Filter-CPU-features-reported-by-QEMU.patch b/libvirt-qemu_monitor-Filter-CPU-features-reported-by-QEMU.patch new file mode 100644 index 0000000..5d2c6ae --- /dev/null +++ b/libvirt-qemu_monitor-Filter-CPU-features-reported-by-QEMU.patch @@ -0,0 +1,182 @@ +From 8b3f1c5a62ada0014cb1dc245ffc67679f3e26df Mon Sep 17 00:00:00 2001 +Message-ID: <8b3f1c5a62ada0014cb1dc245ffc67679f3e26df.1763729878.git.jdenemar@redhat.com> +From: Jiri Denemark +Date: Fri, 24 Oct 2025 17:16:32 +0200 +Subject: [PATCH] qemu_monitor: Filter CPU features reported by QEMU +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Some features may be on our ignore list because they do nothing even +though QEMU still supports them and reports their state. But as the +features do nothing, the state reported by QEMU may not correspond to +what the guest sees. To avoid possible confusion we may just pretend +QEMU did not report any of the features on our ignore list. + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 4d5c1bc24119e90dfbcdae6a120027e5c1ede608) + +https://issues.redhat.com/browse/RHEL-126094 + +Conflicts: + src/qemu/qemu_monitor.c + src/qemu/qemu_monitor.h + src/qemu/qemu_monitor_json.c + src/qemu/qemu_process.c + tests/qemumonitorjsontest.c + - the qom-list-get series optimizing CPU feature probing was + not backported + +Signed-off-by: Jiri Denemark +--- + src/qemu/qemu_monitor.c | 6 ++++-- + src/qemu/qemu_monitor.h | 1 + + src/qemu/qemu_monitor_json.c | 18 +++++++++++++++--- + src/qemu/qemu_monitor_json.h | 1 + + src/qemu/qemu_process.c | 1 + + 5 files changed, 22 insertions(+), 5 deletions(-) + +diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c +index c1fef8d5de..67182c41b9 100644 +--- a/src/qemu/qemu_monitor.c ++++ b/src/qemu/qemu_monitor.c +@@ -3729,7 +3729,8 @@ qemuMonitorGetGuestCPUx86(qemuMonitor *mon, + * @arch: CPU architecture + * @cpuQOMPath: QOM path of a CPU to probe + * @translate: callback for translating CPU feature names from QEMU to libvirt +- * @opaque: data for @translate callback ++ * @filter: callback for filtering ignored features, a pointer to @arch is ++ * passed as opaque pointer to the callback + * @enabled: returns the CPU data for all enabled features + * @disabled: returns the CPU data for features which we asked for + * (either explicitly or via a named CPU model) but QEMU disabled them +@@ -3743,6 +3744,7 @@ qemuMonitorGetGuestCPU(qemuMonitor *mon, + virArch arch, + const char *cpuQOMPath, + qemuMonitorCPUFeatureTranslationCallback translate, ++ virCPUDefFeatureFilter filter, + virCPUData **enabled, + virCPUData **disabled) + { +@@ -3756,7 +3758,7 @@ qemuMonitorGetGuestCPU(qemuMonitor *mon, + *disabled = NULL; + + return qemuMonitorJSONGetGuestCPU(mon, arch, cpuQOMPath, translate, +- enabled, disabled); ++ filter, enabled, disabled); + } + + +diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h +index 755f347e17..dea2c21921 100644 +--- a/src/qemu/qemu_monitor.h ++++ b/src/qemu/qemu_monitor.h +@@ -1281,6 +1281,7 @@ int qemuMonitorGetGuestCPU(qemuMonitor *mon, + virArch arch, + const char *cpuQOMPath, + qemuMonitorCPUFeatureTranslationCallback translate, ++ virCPUDefFeatureFilter filter, + virCPUData **enabled, + virCPUData **disabled); + +diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c +index 9f51421478..78a276a004 100644 +--- a/src/qemu/qemu_monitor_json.c ++++ b/src/qemu/qemu_monitor_json.c +@@ -6841,6 +6841,7 @@ static int + qemuMonitorJSONGetCPUData(qemuMonitor *mon, + const char *cpuQOMPath, + qemuMonitorCPUFeatureTranslationCallback translate, ++ virCPUDefFeatureFilter filter, + virCPUData *data) + { + qemuMonitorJSONObjectProperty prop = { .type = QEMU_MONITOR_OBJECT_PROPERTY_BOOLEAN }; +@@ -6862,6 +6863,9 @@ qemuMonitorJSONGetCPUData(qemuMonitor *mon, + if (translate) + name = translate(data->arch, name); + ++ if (filter && !filter(name, VIR_CPU_FEATURE_REQUIRE, &data->arch)) ++ continue; ++ + if (virCPUDataAddFeature(data, name) < 0) + return -1; + } +@@ -6874,6 +6878,7 @@ static int + qemuMonitorJSONGetCPUDataDisabled(qemuMonitor *mon, + const char *cpuQOMPath, + qemuMonitorCPUFeatureTranslationCallback translate, ++ virCPUDefFeatureFilter filter, + virCPUData *data) + { + g_auto(GStrv) props = NULL; +@@ -6889,6 +6894,9 @@ qemuMonitorJSONGetCPUDataDisabled(qemuMonitor *mon, + if (translate) + name = translate(data->arch, name); + ++ if (filter && !filter(name, VIR_CPU_FEATURE_REQUIRE, &data->arch)) ++ continue; ++ + if (virCPUDataAddFeature(data, name) < 0) + return -1; + } +@@ -6903,7 +6911,8 @@ qemuMonitorJSONGetCPUDataDisabled(qemuMonitor *mon, + * @arch: CPU architecture + * @cpuQOMPath: QOM path of a CPU to probe + * @translate: callback for translating CPU feature names from QEMU to libvirt +- * @opaque: data for @translate callback ++ * @filter: callback for filtering ignored features, a pointer to @arch is ++ * passed as opaque pointer to the callback + * @enabled: returns the CPU data for all enabled features + * @disabled: returns the CPU data for features which we asked for + * (either explicitly or via a named CPU model) but QEMU disabled them +@@ -6917,6 +6926,7 @@ qemuMonitorJSONGetGuestCPU(qemuMonitor *mon, + virArch arch, + const char *cpuQOMPath, + qemuMonitorCPUFeatureTranslationCallback translate, ++ virCPUDefFeatureFilter filter, + virCPUData **enabled, + virCPUData **disabled) + { +@@ -6927,11 +6937,13 @@ qemuMonitorJSONGetGuestCPU(qemuMonitor *mon, + !(cpuDisabled = virCPUDataNew(arch))) + return -1; + +- if (qemuMonitorJSONGetCPUData(mon, cpuQOMPath, translate, cpuEnabled) < 0) ++ if (qemuMonitorJSONGetCPUData(mon, cpuQOMPath, translate, filter, ++ cpuEnabled) < 0) + return -1; + + if (disabled && +- qemuMonitorJSONGetCPUDataDisabled(mon, cpuQOMPath, translate, cpuDisabled) < 0) ++ qemuMonitorJSONGetCPUDataDisabled(mon, cpuQOMPath, translate, filter, ++ cpuDisabled) < 0) + return -1; + + *enabled = g_steal_pointer(&cpuEnabled); +diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h +index bd437f7938..3971d5854a 100644 +--- a/src/qemu/qemu_monitor_json.h ++++ b/src/qemu/qemu_monitor_json.h +@@ -579,6 +579,7 @@ qemuMonitorJSONGetGuestCPU(qemuMonitor *mon, + virArch arch, + const char *cpuQOMPath, + qemuMonitorCPUFeatureTranslationCallback translate, ++ virCPUDefFeatureFilter filter, + virCPUData **enabled, + virCPUData **disabled); + +diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c +index 13dae2aa6a..7d5d2f6478 100644 +--- a/src/qemu/qemu_process.c ++++ b/src/qemu/qemu_process.c +@@ -4596,6 +4596,7 @@ qemuProcessFetchGuestCPU(virDomainObj *vm, + vm->def->os.arch, + cpuQOMPath, + virQEMUCapsCPUFeatureFromQEMU, ++ virQEMUCapsCPUFilterFeatures, + &dataEnabled, &dataDisabled); + } else { + rc = qemuMonitorGetGuestCPUx86(priv->mon, cpuQOMPath, &dataEnabled, &dataDisabled); +-- +2.51.1 diff --git a/libvirt-qemu_process-Always-fix-CPUs-on-reconnect.patch b/libvirt-qemu_process-Always-fix-CPUs-on-reconnect.patch new file mode 100644 index 0000000..91d4ee4 --- /dev/null +++ b/libvirt-qemu_process-Always-fix-CPUs-on-reconnect.patch @@ -0,0 +1,46 @@ +From bf6a6eab87178c3b0438d8f574447eb16669013b Mon Sep 17 00:00:00 2001 +Message-ID: +From: Jiri Denemark +Date: Fri, 24 Oct 2025 15:36:18 +0200 +Subject: [PATCH] qemu_process: Always fix CPUs on reconnect +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +We fix CPUs (i.e., remove ignored CPU features) only when libvirt/QEMU +combo used to start the domain is very old and doesn't support +query-cpu-model-expansion, in which case the CPU definition may contain +features that are unknown to QEMU. But even if both libvirt and QEMU are +new enough, we still want to remove features that do nothing to minimize +confusion or to avoid false migration issues. + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit c15ae99dab903004b82f8447f44df09973696f72) + +https://issues.redhat.com/browse/RHEL-126094 +Signed-off-by: Jiri Denemark +--- + src/qemu/qemu_process.c | 7 +------ + 1 file changed, 1 insertion(+), 6 deletions(-) + +diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c +index 192b015482..13dae2aa6a 100644 +--- a/src/qemu/qemu_process.c ++++ b/src/qemu/qemu_process.c +@@ -9415,12 +9415,7 @@ qemuProcessRefreshCPU(virQEMUDriver *driver, + + if (qemuProcessUpdateCPU(vm, VIR_ASYNC_JOB_NONE) < 0) + return -1; +- } else if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION)) { +- /* We only try to fix CPUs when the libvirt/QEMU combo used to start +- * the domain did not know about query-cpu-model-expansion in which +- * case the host-model is known to not contain features which QEMU +- * doesn't know about. +- */ ++ } else { + qemuDomainFixupCPUs(vm, priv->origCPU); + } + +-- +2.51.1 diff --git a/libvirt.spec b/libvirt.spec index 999ffca..588d436 100644 --- a/libvirt.spec +++ b/libvirt.spec @@ -293,7 +293,7 @@ Summary: Library providing a simple virtualization API Name: libvirt Version: 11.5.0 -Release: 4.1%{?dist}%{?extra_release}.alma.1 +Release: 4.2%{?dist}%{?extra_release}.alma.1 License: GPL-2.0-or-later AND LGPL-2.1-only AND LGPL-2.1-or-later AND OFL-1.1 URL: https://libvirt.org/ @@ -343,6 +343,12 @@ Patch39: libvirt-qemu-Send-event-VIR_DOMAIN_EVENT_-STOPPED-STARTED-during-recrea Patch40: libvirt-qemu-Support-domain-reset-command-for-TDX-guest.patch Patch41: libvirt-qemuxmlconftest-Add-latest-version-of-launch-security-tdx-test-data.patch Patch42: libvirt-docs-domain-Add-documentation-for-Intel-TDX-guest.patch +Patch43: libvirt-cpu_conf-Make-virCPUDefFilterFeatures-return-void.patch +Patch44: libvirt-qemu_domain-Simplify-qemuDomainFixupCPUs.patch +Patch45: libvirt-qemu_domain-Fix-qemuDomainFixupCPUs.patch +Patch46: libvirt-qemu_process-Always-fix-CPUs-on-reconnect.patch +Patch47: libvirt-qemu_monitor-Filter-CPU-features-reported-by-QEMU.patch +Patch48: libvirt-qemu-Ignore-ht-CPU-feature.patch Requires: libvirt-daemon = %{version}-%{release} @@ -2738,9 +2744,17 @@ exit 0 %endif %changelog -* Thu Dec 04 2025 Eduard Abdullin - 11.5.0-4.1.alma.1 +* Mon Dec 22 2025 Eduard Abdullin - 11.5.0-4.2.alma.1 - Enable building for ppc64le +* Fri Nov 21 2025 Jiri Denemark - 11.5.0-4.2.el10_1 +- cpu_conf: Make virCPUDefFilterFeatures return void (RHEL-126094) +- qemu_domain: Simplify qemuDomainFixupCPUs (RHEL-126094) +- qemu_domain: Fix qemuDomainFixupCPUs (RHEL-126094) +- qemu_process: Always fix CPUs on reconnect (RHEL-126094) +- qemu_monitor: Filter CPU features reported by QEMU (RHEL-126094) +- qemu: Ignore "ht" CPU feature (RHEL-126094) + * Wed Oct 8 2025 Jiri Denemark - 11.5.0-4.1.el10_1 - tools: Secure guest check for Intel in virt-host-validate (RHEL-111863) - qemu: Check if INTEL Trust Domain Extention support is enabled (RHEL-111863)