[libvirt PATCH 05/11] Introduce virCPUGetVendorForModel and use it in QEMU driver

Jiri Denemark jdenemar at redhat.com
Tue Oct 4 14:28:48 UTC 2022


So far QEMU driver does not get CPU model vendor from QEMU directly and
it has to ask the CPU driver for the info stored in CPU map.

Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
---
 src/cpu/cpu.c                | 25 +++++++++++++++++++++++++
 src/cpu/cpu.h                |  8 ++++++++
 src/libvirt_private.syms     |  1 +
 src/qemu/qemu_capabilities.c | 18 +++++++++++++-----
 4 files changed, 47 insertions(+), 5 deletions(-)

diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c
index d97ef5e873..7f3caf7a27 100644
--- a/src/cpu/cpu.c
+++ b/src/cpu/cpu.c
@@ -923,6 +923,31 @@ virCPUGetModels(virArch arch, char ***models)
 }
 
 
+/** virCPUGetVendorForModel:
+ *
+ * @arch: CPU architecture
+ * @model: CPU model to be checked
+ *
+ * Returns @model's vendor or NULL if the vendor is unknown.
+ */
+const char *
+virCPUGetVendorForModel(virArch arch,
+                        const char *model)
+{
+    struct cpuArchDriver *driver;
+
+    VIR_DEBUG("arch=%s", virArchToString(arch));
+
+    if (!(driver = cpuGetSubDriver(arch)))
+        return NULL;
+
+    if (!driver->getVendorForModel)
+        return NULL;
+
+    return driver->getVendorForModel(model);
+}
+
+
 /**
  * virCPUTranslate:
  *
diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h
index 41a62ce486..a4cdb37f03 100644
--- a/src/cpu/cpu.h
+++ b/src/cpu/cpu.h
@@ -105,6 +105,9 @@ typedef virCPUData *
 typedef int
 (*virCPUArchGetModels)(char ***models);
 
+typedef const char *
+(*virCPUArchGetVendorForModel)(const char *model);
+
 typedef int
 (*virCPUArchTranslate)(virCPUDef *cpu,
                        virDomainCapsCPUModels *models);
@@ -150,6 +153,7 @@ struct cpuArchDriver {
     virCPUArchDataFormat dataFormat;
     virCPUArchDataParse dataParse;
     virCPUArchGetModels getModels;
+    virCPUArchGetVendorForModel getVendorForModel;
     virCPUArchTranslate translate;
     virCPUArchConvertLegacy convertLegacy;
     virCPUArchExpandFeatures expandFeatures;
@@ -262,6 +266,10 @@ virCPUModelIsAllowed(const char *model,
 int
 virCPUGetModels(virArch arch, char ***models);
 
+const char *
+virCPUGetVendorForModel(virArch arch,
+                        const char *model);
+
 int
 virCPUTranslate(virArch arch,
                 virCPUDef *cpu,
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 5be40dbefe..8c3a688d41 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1513,6 +1513,7 @@ virCPUExpandFeatures;
 virCPUGetHost;
 virCPUGetHostIsSupported;
 virCPUGetModels;
+virCPUGetVendorForModel;
 virCPUProbeHost;
 virCPUTranslate;
 virCPUUpdate;
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 1c771dbfb9..8e8a84e614 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -2175,9 +2175,11 @@ virQEMUCapsAddCPUDefinitions(virQEMUCaps *qemuCaps,
 
 
 static virDomainCapsCPUModels *
-virQEMUCapsCPUDefsToModels(qemuMonitorCPUDefs *defs,
+virQEMUCapsCPUDefsToModels(virArch arch,
+                           qemuMonitorCPUDefs *defs,
                            const char **modelAllowed,
-                           const char **modelForbidden)
+                           const char **modelForbidden,
+                           bool vendors)
 {
     virDomainCapsCPUModels *cpuModels = NULL;
     size_t i;
@@ -2187,6 +2189,7 @@ virQEMUCapsCPUDefsToModels(qemuMonitorCPUDefs *defs,
 
     for (i = 0; i < defs->ncpus; i++) {
         qemuMonitorCPUDefInfo *cpu = defs->cpus + i;
+        char *vendor = NULL;
 
         if (modelAllowed && !g_strv_contains(modelAllowed, cpu->name))
             continue;
@@ -2194,8 +2197,11 @@ virQEMUCapsCPUDefsToModels(qemuMonitorCPUDefs *defs,
         if (modelForbidden && g_strv_contains(modelForbidden, cpu->name))
             continue;
 
+        if (vendors)
+            vendor = g_strdup(virCPUGetVendorForModel(arch, cpu->name));
+
         virDomainCapsCPUModelsAdd(cpuModels, cpu->name, cpu->usable,
-                                  cpu->blockers, cpu->deprecated, NULL);
+                                  cpu->blockers, cpu->deprecated, vendor);
     }
 
     return cpuModels;
@@ -2213,7 +2219,8 @@ virQEMUCapsGetCPUModels(virQEMUCaps *qemuCaps,
     if (!(defs = virQEMUCapsGetAccel(qemuCaps, type)->cpuModels))
         return NULL;
 
-    return virQEMUCapsCPUDefsToModels(defs, modelAllowed, modelForbidden);
+    return virQEMUCapsCPUDefsToModels(qemuCaps->arch, defs,
+                                      modelAllowed, modelForbidden, true);
 }
 
 
@@ -2946,7 +2953,8 @@ virQEMUCapsFetchCPUModels(qemuMonitor *mon,
     if (virQEMUCapsFetchCPUDefinitions(mon, arch, &defs) < 0)
         return -1;
 
-    if (defs && !(*cpuModels = virQEMUCapsCPUDefsToModels(defs, NULL, NULL)))
+    if (defs &&
+        !(*cpuModels = virQEMUCapsCPUDefsToModels(arch, defs, NULL, NULL, false)))
         return -1;
 
     return 0;
-- 
2.37.3



More information about the libvir-list mailing list