From e20a11eecf30ee39d37f5b17e3bc04a907c5921f Mon Sep 17 00:00:00 2001 From: Jiri Denemark Date: Fri, 20 Sep 2019 22:41:34 +0200 Subject: [PATCH] qemu: Copy CPU models in virQEMUCapsGetCPUDefinitions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rather than returning a direct pointer the list stored in qemuCaps the function now creates a new copy of the CPU models list. The main purpose of this seemingly useless change is to update callers to free the result returned by virQEMUCapsGetCPUDefinitions because the internals of this function will change significantly in the following patches. Signed-off-by: Jiri Denemark Reviewed-by: Ján Tomko --- src/conf/domain_capabilities.h | 2 ++ src/qemu/qemu_capabilities.c | 23 ++++++++++++++++++----- src/qemu/qemu_driver.c | 2 +- src/qemu/qemu_process.c | 7 +++++-- tests/cputest.c | 1 - 5 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/conf/domain_capabilities.h b/src/conf/domain_capabilities.h index a9bf4a8d3f..6ecabc6e77 100644 --- a/src/conf/domain_capabilities.h +++ b/src/conf/domain_capabilities.h @@ -139,6 +139,8 @@ struct _virDomainCapsCPUModels { virDomainCapsCPUModelPtr models; }; +G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainCapsCPUModels, virObjectUnref); + typedef struct _virDomainCapsCPU virDomainCapsCPU; typedef virDomainCapsCPU *virDomainCapsCPUPtr; struct _virDomainCapsCPU { diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 7c30768379..6e5d894a36 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -1885,10 +1885,17 @@ virDomainCapsCPUModelsPtr virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps, virDomainVirtType type) { + virDomainCapsCPUModelsPtr cpuModels; + if (type == VIR_DOMAIN_VIRT_KVM) - return qemuCaps->kvmCPUModels; + cpuModels = qemuCaps->kvmCPUModels; else - return qemuCaps->tcgCPUModels; + cpuModels = qemuCaps->tcgCPUModels; + + if (!cpuModels) + return NULL; + + return virDomainCapsCPUModelsCopy(cpuModels); } @@ -3115,6 +3122,7 @@ virQEMUCapsInitCPUModelX86(virQEMUCapsPtr qemuCaps, virCPUDefPtr cpu, bool migratable) { + g_autoptr(virDomainCapsCPUModels) cpuModels = NULL; virCPUDataPtr data = NULL; int ret = -1; @@ -3124,7 +3132,9 @@ virQEMUCapsInitCPUModelX86(virQEMUCapsPtr qemuCaps, if (!(data = virQEMUCapsGetCPUModelX86Data(qemuCaps, model, migratable))) goto cleanup; - if (cpuDecode(cpu, data, virQEMUCapsGetCPUDefinitions(qemuCaps, type)) < 0) + cpuModels = virQEMUCapsGetCPUDefinitions(qemuCaps, type); + + if (cpuDecode(cpu, data, cpuModels) < 0) goto cleanup; ret = 0; @@ -3207,10 +3217,13 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps, if ((rc = virQEMUCapsInitCPUModel(qemuCaps, type, cpu, false)) < 0) { goto error; } else if (rc == 1) { + g_autoptr(virDomainCapsCPUModels) cpuModels = NULL; + VIR_DEBUG("No host CPU model info from QEMU; probing host CPU directly"); - hostCPU = virQEMUCapsProbeHostCPU(hostArch, - virQEMUCapsGetCPUDefinitions(qemuCaps, type)); + cpuModels = virQEMUCapsGetCPUDefinitions(qemuCaps, type); + hostCPU = virQEMUCapsProbeHostCPU(hostArch, cpuModels); + if (!hostCPU || virCPUDefCopyModelFilter(cpu, hostCPU, true, virQEMUCapsCPUFilterFeatures, diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index dc14ec86a3..f5e3671c2b 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -13684,7 +13684,7 @@ qemuConnectBaselineHypervisorCPU(virConnectPtr conn, g_autoptr(virQEMUCaps) qemuCaps = NULL; virArch arch; virDomainVirtType virttype; - virDomainCapsCPUModelsPtr cpuModels; + g_autoptr(virDomainCapsCPUModels) cpuModels = NULL; bool migratable; virCPUDefPtr cpu = NULL; char *cpustr = NULL; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 31d797e143..148d498035 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -6040,6 +6040,8 @@ qemuProcessUpdateGuestCPU(virDomainDefPtr def, /* nothing to update for host-passthrough */ if (def->cpu->mode != VIR_CPU_MODE_HOST_PASSTHROUGH) { + g_autoptr(virDomainCapsCPUModels) cpuModels = NULL; + if (def->cpu->check == VIR_CPU_CHECK_PARTIAL && virCPUCompare(caps->host.arch, virQEMUCapsGetHostModel(qemuCaps, def->virtType, @@ -6052,8 +6054,9 @@ qemuProcessUpdateGuestCPU(virDomainDefPtr def, VIR_QEMU_CAPS_HOST_CPU_MIGRATABLE)) < 0) return -1; - if (virCPUTranslate(def->os.arch, def->cpu, - virQEMUCapsGetCPUDefinitions(qemuCaps, def->virtType)) < 0) + cpuModels = virQEMUCapsGetCPUDefinitions(qemuCaps, def->virtType); + + if (virCPUTranslate(def->os.arch, def->cpu, cpuModels) < 0) return -1; def->cpu->fallback = VIR_CPU_FALLBACK_FORBID; diff --git a/tests/cputest.c b/tests/cputest.c index 18c8e8b09c..b8ec76d2fe 100644 --- a/tests/cputest.c +++ b/tests/cputest.c @@ -543,7 +543,6 @@ cpuTestGetCPUModels(const struct data *data, return -1; *models = virQEMUCapsGetCPUDefinitions(qemuCaps, VIR_DOMAIN_VIRT_KVM); - virObjectRef(*models); virObjectUnref(qemuCaps);