- conf: Parse hyperv features even for host-model (RHEL-151688) - qemu: Wire up new hyperv host-model mode behavior (RHEL-151688) - Introduce EXPAND_CPU_FEATURES flag for domain capabilities (RHEL-153653) - qemu: Implement VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES (RHEL-153653) - virsh: Add --expand-cpu-features option for domcapabilities (RHEL-153653) - docs: Clarify host-model description in domain capabilities (RHEL-153653) - qemu: Fix job handling when domain dies in post-copy migration (RHEL-145179) - security_apparmor: Use g_auto* in AppArmorSetSecurityHostdevLabel (RHEL-159902) - security: Cleanup hostdev label error logic (RHEL-159902) - qemu: Fix IOMMUFD and VFIO security labels (RHEL-159902) - viriommufd: Set IOMMU_OPTION_RLIMIT_MODE only when running privileged (RHEL-156803) - conf: Move and rename virStorageSourceFDTuple object (RHEL-156803) - conf: Refactor virHostdevIsPCIDevice (RHEL-156803) - hypervisor: Fix virHostdevNeedsVFIO detection (RHEL-156803) - qemu: Expand call to qemuDomainNeedsVFIO (RHEL-156803) - qemu: Update qemuDomainNeedsVFIO to ignore PCI hostdev with IOMMUFD (RHEL-156803) - src: Use virHostdevIsPCIDeviceWith* to check for IOMMUFD (RHEL-156803) - conf: Introduce domain iommufd element (RHEL-156803) - qemu: Implement iommufd (RHEL-156803) - conf: Add iommufd fdgroup support (RHEL-156803) - qemu: Implement iommufd fdgroup (RHEL-156803) - tests: Add iommufd fdgroup test (RHEL-156803) - hypervisor: Call virWaitForDevices() after detaching host devices (RHEL-156803) - qemuMigrationSrcBeginXML: Don't call 'qemuMigrationSrcBeginPhaseBlockDirtyBitmaps' with offline VM (RHEL-173433) - qemuMigrationSrcBeginPhase: Don't call 'qemuBlockNodesEnsureActive' with offline VM (RHEL-173433) - util: virGetSubIDs: do not limit file size (RHEL-174491) - cpu_conf: Introduce virCPUDefSortFeatures (RHEL-177364) - qemu_capabilities: Split virQEMUCapsFillDomainCPUCaps (RHEL-177364) - qemu: Move domain caps flags handling to virQEMUCapsFillDomainCPUHostModel (RHEL-177364) - qemu_capabilities: Always sort features in host-model CPU (RHEL-177364) - qemu_capabilities: Use g_autoptr in virQEMUCapsInitHostCPUModel (RHEL-177364) - qemu_capabilities: Split conditions in virQEMUCapsInitHostCPUModel (RHEL-177364) - qemu_capabilities: Cache expanded CPU (RHEL-177364) - domaincapstest: Test EXPAND_CPU_FEATURES flag (RHEL-177364) - util: Publish and mock virHostCPUGetMSRFromKVM (RHEL-177364) - cpu_x86: Introduce virCPUx86DataAddMSR (RHEL-177364) - cpu: Introduce virCPUUpdateFeatures (RHEL-177364) - Fix documentation of VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES (RHEL-177364) - Introduce VIR_CONNECT_GET_DOMAIN_CAPABILITIES_SUPPORTED_CPU_FEATURES flag (RHEL-177364) - virsh: Add --supported-cpu-features option for domcapabilities (RHEL-177364) - domaincapstest: Test SUPPORTED_CPU_FEATURES flag (RHEL-177364) - qemu_capabilities: Fix domain capabilities on AMD CPUs (RHEL-177364) - distro: Replace old gating with tmt Resolves: RHEL-145179, RHEL-151688, RHEL-153653, RHEL-156803, RHEL-159902 Resolves: RHEL-173433, RHEL-174491, RHEL-177364
159 lines
6.3 KiB
Diff
159 lines
6.3 KiB
Diff
From fba9c200834d8d31ed34e632470563a0074fe528 Mon Sep 17 00:00:00 2001
|
|
Message-ID: <fba9c200834d8d31ed34e632470563a0074fe528.1780571167.git.jdenemar@redhat.com>
|
|
From: Jiri Denemark <jdenemar@redhat.com>
|
|
Date: Thu, 21 May 2026 17:55:28 +0200
|
|
Subject: [PATCH] qemu_capabilities: Cache expanded CPU
|
|
|
|
When probing host model CPU we already expand it to get a list of all
|
|
CPU features. Let's store the expanded CPU definition in virQEMUCaps and
|
|
copy it to domain capabilities when requested by the
|
|
VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES flag instead of
|
|
expanding the CPU over and over on each request.
|
|
|
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
|
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
|
(cherry picked from commit 312000a739aebaa9de655bb1f6a539326ea8783d)
|
|
|
|
https://redhat.atlassian.net/browse/RHEL-177364
|
|
|
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
|
---
|
|
src/qemu/qemu_capabilities.c | 39 ++++++++++++++++++++++++++----------
|
|
src/qemu/qemu_capabilities.h | 3 +++
|
|
2 files changed, 31 insertions(+), 11 deletions(-)
|
|
|
|
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
|
|
index 2e8f220abc..555723cafb 100644
|
|
--- a/src/qemu/qemu_capabilities.c
|
|
+++ b/src/qemu/qemu_capabilities.c
|
|
@@ -788,6 +788,9 @@ struct _virQEMUCapsHostCPUData {
|
|
unsigned int physAddrSize;
|
|
/* Host CPU definition reported in domain capabilities. */
|
|
virCPUDef *reported;
|
|
+ /* Expanded host CPU definition with features that are implicitly enabled
|
|
+ * by the selected CPU model. */
|
|
+ virCPUDef *expanded;
|
|
/* Migratable host CPU definition used for updating guest CPU. */
|
|
virCPUDef *migratable;
|
|
/* CPU definition with features detected by libvirt using virCPUGetHost
|
|
@@ -1962,6 +1965,9 @@ virQEMUCapsHostCPUDataCopy(virQEMUCapsHostCPUData *dst,
|
|
if (src->reported)
|
|
dst->reported = virCPUDefCopy(src->reported);
|
|
|
|
+ if (src->expanded)
|
|
+ dst->expanded = virCPUDefCopy(src->expanded);
|
|
+
|
|
if (src->migratable)
|
|
dst->migratable = virCPUDefCopy(src->migratable);
|
|
|
|
@@ -1975,6 +1981,7 @@ virQEMUCapsHostCPUDataClear(virQEMUCapsHostCPUData *cpuData)
|
|
{
|
|
qemuMonitorCPUModelInfoFree(cpuData->info);
|
|
virCPUDefFree(cpuData->reported);
|
|
+ virCPUDefFree(cpuData->expanded);
|
|
virCPUDefFree(cpuData->migratable);
|
|
virCPUDefFree(cpuData->full);
|
|
|
|
@@ -2301,6 +2308,9 @@ virQEMUCapsGetHostModel(virQEMUCaps *qemuCaps,
|
|
/* 'full' is non-NULL only if we have data from both QEMU and
|
|
* virCPUGetHost */
|
|
return cpuData->full ? cpuData->full : cpuData->reported;
|
|
+
|
|
+ case VIR_QEMU_CAPS_HOST_CPU_EXPANDED:
|
|
+ return cpuData->expanded;
|
|
}
|
|
|
|
return NULL;
|
|
@@ -2312,6 +2322,7 @@ virQEMUCapsSetHostModel(virQEMUCaps *qemuCaps,
|
|
virDomainVirtType type,
|
|
unsigned int physAddrSize,
|
|
virCPUDef *reported,
|
|
+ virCPUDef *expanded,
|
|
virCPUDef *migratable,
|
|
virCPUDef *full)
|
|
{
|
|
@@ -2320,6 +2331,7 @@ virQEMUCapsSetHostModel(virQEMUCaps *qemuCaps,
|
|
cpuData = &virQEMUCapsGetAccel(qemuCaps, type)->hostCPU;
|
|
cpuData->physAddrSize = physAddrSize;
|
|
cpuData->reported = reported;
|
|
+ cpuData->expanded = expanded;
|
|
cpuData->migratable = migratable;
|
|
cpuData->full = full;
|
|
}
|
|
@@ -4123,16 +4135,18 @@ virQEMUCapsInitHostCPUModel(virQEMUCaps *qemuCaps,
|
|
|
|
virCPUDefCopyModelFilter(cpu, hostCPU, true, virQEMUCapsCPUFilterFeatures,
|
|
&qemuCaps->arch);
|
|
- } else if (virQEMUCapsTypeIsAccelerated(type) &&
|
|
- virCPUGetHostIsSupported(qemuCaps->arch)) {
|
|
+ }
|
|
+
|
|
+ cpuExpanded = virCPUDefCopy(cpu);
|
|
+ if (virCPUExpandFeatures(qemuCaps->arch, cpuExpanded) < 0)
|
|
+ goto error;
|
|
+
|
|
+ if (rc == 0 &&
|
|
+ virQEMUCapsTypeIsAccelerated(type) &&
|
|
+ virCPUGetHostIsSupported(qemuCaps->arch)) {
|
|
if (!(fullCPU = virQEMUCapsProbeHostCPU(qemuCaps->arch, NULL)))
|
|
goto error;
|
|
|
|
- cpuExpanded = virCPUDefCopy(cpu);
|
|
-
|
|
- if (virCPUExpandFeatures(qemuCaps->arch, cpuExpanded) < 0)
|
|
- goto error;
|
|
-
|
|
for (i = 0; i < cpuExpanded->nfeatures; i++) {
|
|
if (cpuExpanded->features[i].policy == VIR_CPU_FEATURE_REQUIRE)
|
|
virCPUDefUpdateFeature(fullCPU, cpuExpanded->features[i].name,
|
|
@@ -4171,6 +4185,7 @@ virQEMUCapsInitHostCPUModel(virQEMUCaps *qemuCaps,
|
|
|
|
virQEMUCapsSetHostModel(qemuCaps, type, physAddrSize,
|
|
g_steal_pointer(&cpu),
|
|
+ g_steal_pointer(&cpuExpanded),
|
|
g_steal_pointer(&migCPU),
|
|
g_steal_pointer(&fullCPU));
|
|
|
|
@@ -6587,9 +6602,14 @@ virQEMUCapsFillDomainCPUHostModel(virQEMUCaps *qemuCaps,
|
|
virDomainCaps *domCaps,
|
|
unsigned int flags)
|
|
{
|
|
- virQEMUCapsHostCPUType cpuType = VIR_QEMU_CAPS_HOST_CPU_REPORTED;
|
|
+ virQEMUCapsHostCPUType cpuType;
|
|
virCPUDef *cpu;
|
|
|
|
+ if (flags & VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES)
|
|
+ cpuType = VIR_QEMU_CAPS_HOST_CPU_EXPANDED;
|
|
+ else
|
|
+ cpuType = VIR_QEMU_CAPS_HOST_CPU_REPORTED;
|
|
+
|
|
cpu = virCPUDefCopy(virQEMUCapsGetHostModel(qemuCaps, domCaps->virttype,
|
|
cpuType));
|
|
|
|
@@ -6600,9 +6620,6 @@ virQEMUCapsFillDomainCPUHostModel(virQEMUCaps *qemuCaps,
|
|
cpu, VIR_CPU_FEATURE_DISABLE);
|
|
}
|
|
|
|
- if (flags & VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES)
|
|
- virCPUExpandFeatures(domCaps->arch, cpu);
|
|
-
|
|
virCPUDefSortFeatures(cpu);
|
|
domCaps->cpu.hostModel = cpu;
|
|
}
|
|
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
|
|
index bc3ecbb89f..8822bf120b 100644
|
|
--- a/src/qemu/qemu_capabilities.h
|
|
+++ b/src/qemu/qemu_capabilities.h
|
|
@@ -788,6 +788,9 @@ typedef enum {
|
|
* combined with features reported by QEMU. This is used for backward
|
|
* compatible comparison between a guest CPU and a host CPU. */
|
|
VIR_QEMU_CAPS_HOST_CPU_FULL,
|
|
+ /* Expanded host CPU definition with features that are implicitly enabled
|
|
+ * by the selected CPU model. */
|
|
+ VIR_QEMU_CAPS_HOST_CPU_EXPANDED,
|
|
} virQEMUCapsHostCPUType;
|
|
|
|
virCPUDef *virQEMUCapsGetHostModel(virQEMUCaps *qemuCaps,
|
|
--
|
|
2.54.0
|