[libvirt] [PATCH 03/22] qemu: Copy CPU models in virQEMUCapsGetCPUDefinitions

Jiri Denemark jdenemar at redhat.com
Thu Oct 3 14:00:21 UTC 2019


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 <jdenemar at redhat.com>
---
 src/qemu/qemu_capabilities.c | 23 ++++++++++++++++++-----
 src/qemu/qemu_driver.c       |  2 +-
 src/qemu/qemu_process.c      |  7 +++++--
 tests/cputest.c              |  1 -
 4 files changed, 24 insertions(+), 9 deletions(-)

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 806d102efd..705e3a87b0 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -1883,10 +1883,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);
 }
 
 
@@ -3084,6 +3091,7 @@ virQEMUCapsInitCPUModelX86(virQEMUCapsPtr qemuCaps,
                            virCPUDefPtr cpu,
                            bool migratable)
 {
+    VIR_AUTOUNREF(virDomainCapsCPUModelsPtr) cpuModels = NULL;
     virCPUDataPtr data = NULL;
     int ret = -1;
 
@@ -3093,7 +3101,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;
@@ -3176,10 +3186,13 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps,
     if ((rc = virQEMUCapsInitCPUModel(qemuCaps, type, cpu, false)) < 0) {
         goto error;
     } else if (rc == 1) {
+        VIR_AUTOUNREF(virDomainCapsCPUModelsPtr) 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 95fe844c34..9e681a22b3 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -13754,7 +13754,7 @@ qemuConnectBaselineHypervisorCPU(virConnectPtr conn,
     virQEMUCapsPtr qemuCaps = NULL;
     virArch arch;
     virDomainVirtType virttype;
-    virDomainCapsCPUModelsPtr cpuModels;
+    VIR_AUTOUNREF(virDomainCapsCPUModelsPtr) 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 a50cd54393..9405bdc3f9 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -6133,6 +6133,8 @@ qemuProcessUpdateGuestCPU(virDomainDefPtr def,
 
     /* nothing to update for host-passthrough */
     if (def->cpu->mode != VIR_CPU_MODE_HOST_PASSTHROUGH) {
+        VIR_AUTOUNREF(virDomainCapsCPUModelsPtr) cpuModels = NULL;
+
         if (def->cpu->check == VIR_CPU_CHECK_PARTIAL &&
             virCPUCompare(caps->host.arch,
                           virQEMUCapsGetHostModel(qemuCaps, def->virtType,
@@ -6145,8 +6147,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 403d23b961..40b843dd8f 100644
--- a/tests/cputest.c
+++ b/tests/cputest.c
@@ -542,7 +542,6 @@ cpuTestGetCPUModels(const struct data *data,
         return -1;
 
     *models = virQEMUCapsGetCPUDefinitions(qemuCaps, VIR_DOMAIN_VIRT_KVM);
-    virObjectRef(*models);
 
     virObjectUnref(qemuCaps);
 
-- 
2.23.0




More information about the libvir-list mailing list