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 <jdene...@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

Reply via email to