[libvirt] [PATCH v3 15/52] qemu: Introduce virQEMUCapsCPUDefsToModels

Jiri Denemark jdenemar at redhat.com
Tue Nov 5 13:27:13 UTC 2019


The function translates qemuMonitorCPUDefsPtr (used by QEMU caps probing
code) into virDomainCapsCPUModelsPtr used by domain capabilities.

Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
Reviewed-by: Ján Tomko <jtomko at redhat.com>
---

Notes:
    Version 2:
    - trivial rebase
    
    Version 3:
    - g_autoptr, g_steal_pointer

 src/qemu/qemu_capabilities.c | 58 ++++++++++++++++++++++--------------
 1 file changed, 35 insertions(+), 23 deletions(-)

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 2a93488520..1497c4f645 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -1881,6 +1881,35 @@ virQEMUCapsAddCPUDefinitions(virQEMUCapsPtr qemuCaps,
 }
 
 
+static virDomainCapsCPUModelsPtr
+virQEMUCapsCPUDefsToModels(qemuMonitorCPUDefsPtr defs,
+                           const char **modelWhitelist,
+                           const char **modelBlacklist)
+{
+    g_autoptr(virDomainCapsCPUModels) cpuModels = NULL;
+    size_t i;
+
+    if (!(cpuModels = virDomainCapsCPUModelsNew(defs->ncpus)))
+        return NULL;
+
+    for (i = 0; i < defs->ncpus; i++) {
+        qemuMonitorCPUDefInfoPtr cpu = defs->cpus + i;
+
+        if (modelWhitelist && !virStringListHasString(modelWhitelist, cpu->name))
+            continue;
+
+        if (modelBlacklist && virStringListHasString(modelBlacklist, cpu->name))
+            continue;
+
+        if (virDomainCapsCPUModelsAdd(cpuModels, cpu->name, cpu->usable,
+                                      cpu->blockers) < 0)
+            return NULL;
+    }
+
+    return g_steal_pointer(&cpuModels);
+}
+
+
 virDomainCapsCPUModelsPtr
 virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps,
                              virDomainVirtType type,
@@ -2448,19 +2477,15 @@ virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon,
                                virDomainCapsCPUModelsPtr *cpuModels)
 {
     g_autoptr(qemuMonitorCPUDefs) defs = NULL;
-    virDomainCapsCPUModelsPtr models = NULL;
     size_t i;
-    int ret = -1;
 
     *cpuModels = NULL;
 
     if (qemuMonitorGetCPUDefinitions(mon, &defs) < 0)
         return -1;
 
-    if (!defs) {
-        ret = 0;
-        goto cleanup;
-    }
+    if (!defs)
+        return 0;
 
     /* QEMU 2.11 for Power renamed all CPU models to lower case, we need to
      * translate them back to libvirt's upper case model names. */
@@ -2469,7 +2494,7 @@ virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon,
         char **name;
 
         if (virCPUGetModels(arch, &libvirtModels) < 0)
-            goto cleanup;
+            return -1;
 
         for (name = libvirtModels; name && *name; name++) {
             for (i = 0; i < defs->ncpus; i++) {
@@ -2482,23 +2507,10 @@ virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon,
         }
     }
 
-    if (!(models = virDomainCapsCPUModelsNew(defs->ncpus)))
-        goto cleanup;
-
-    for (i = 0; i < defs->ncpus; i++) {
-        if (virDomainCapsCPUModelsAddSteal(models,
-                                           &defs->cpus[i].name,
-                                           defs->cpus[i].usable,
-                                           &defs->cpus[i].blockers) < 0)
-            goto cleanup;
-    }
-
-    *cpuModels = g_steal_pointer(&models);
-    ret = 0;
+    if (!(*cpuModels = virQEMUCapsCPUDefsToModels(defs, NULL, NULL)))
+        return -1;
 
- cleanup:
-    virObjectUnref(models);
-    return ret;
+    return 0;
 }
 
 
-- 
2.23.0




More information about the libvir-list mailing list