From 568ce029e7535efb0a40674fd63e21f28948b277 Mon Sep 17 00:00:00 2001 From: Tim Wiederhake Date: Mon, 2 Aug 2021 16:44:22 +0200 Subject: [PATCH] virQEMUCaps: Add host cpuid information Many things can affect the availability of cpu flags (e.g. software upgrades, kernel versions, kernel command line, etc.) and invalidate the cached capabilities without notice. Add CPUID information to the capabilities cache. Signed-off-by: Tim Wiederhake Reviewed-by: Michal Privoznik --- src/qemu/qemu_capabilities.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index e4fdd9a1eb..b2d5242264 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -725,6 +725,7 @@ struct _virQEMUCaps { char *kernelVersion; virArch arch; + virCPUData *cpuData; size_t ngicCapabilities; virGICCapability *gicCapabilities; @@ -1965,6 +1966,7 @@ virQEMUCaps *virQEMUCapsNewCopy(virQEMUCaps *qemuCaps) ret->kernelVersion = g_strdup(qemuCaps->kernelVersion); ret->arch = qemuCaps->arch; + ret->cpuData = virCPUDataNewCopy(qemuCaps->cpuData); if (virQEMUCapsAccelCopy(&ret->kvm, &qemuCaps->kvm) < 0 || virQEMUCapsAccelCopy(&ret->tcg, &qemuCaps->tcg) < 0) @@ -2015,6 +2017,8 @@ void virQEMUCapsDispose(void *obj) g_free(qemuCaps->gicCapabilities); + virCPUDataFree(qemuCaps->cpuData); + virSEVCapabilitiesFree(qemuCaps->sevCapabilities); virQEMUCapsAccelClear(&qemuCaps->kvm); @@ -4260,6 +4264,12 @@ virQEMUCapsLoadCache(virArch hostArch, } VIR_FREE(str); + if (virXPathBoolean("boolean(./cpudata)", ctxt) > 0) { + qemuCaps->cpuData = virCPUDataParseNode(virXPathNode("./cpudata", ctxt)); + if (!qemuCaps->cpuData) + goto cleanup; + } + if (virQEMUCapsLoadAccel(qemuCaps, ctxt, VIR_DOMAIN_VIRT_KVM) < 0 || virQEMUCapsLoadAccel(qemuCaps, ctxt, VIR_DOMAIN_VIRT_QEMU) < 0) goto cleanup; @@ -4561,6 +4571,11 @@ virQEMUCapsFormatCache(virQEMUCaps *qemuCaps) virBufferAsprintf(&buf, "%s\n", qemuCaps->kernelVersion); + if (qemuCaps->cpuData) { + g_autofree char * cpudata = virCPUDataFormat(qemuCaps->cpuData); + virBufferAsprintf(&buf, "%s", cpudata); + } + virBufferAsprintf(&buf, "%s\n", virArchToString(qemuCaps->arch)); @@ -5418,6 +5433,7 @@ virQEMUCapsNewForBinaryInternal(virArch hostArch, if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM)) { qemuCaps->hostCPUSignature = g_strdup(hostCPUSignature); qemuCaps->microcodeVersion = microcodeVersion; + qemuCaps->cpuData = NULL; qemuCaps->kernelVersion = g_strdup(kernelVersion); -- 2.47.2