]> xenbits.xensource.com Git - libvirt.git/commitdiff
Introduce virCPUGetVendorForModel and use it in QEMU driver
authorJiri Denemark <jdenemar@redhat.com>
Thu, 29 Sep 2022 14:32:27 +0000 (16:32 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Mon, 10 Oct 2022 12:31:43 +0000 (14:31 +0200)
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@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/cpu/cpu.c
src/cpu/cpu.h
src/libvirt_private.syms
src/qemu/qemu_capabilities.c

index d97ef5e87347b662f80fc6c6b8d8d388c851c409..7f3caf7a275acfaa61ec8cac41e0fa73b626ce6a 100644 (file)
@@ -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:
  *
index 41a62ce4860cf96fc314656987d1f558a2144bd7..a4cdb37f03a616678cf96f5405399d62a2d8e878 100644 (file)
@@ -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,
index 00cb07709d0b57fdbc26ed3a9dc470997c11460d..9cf5c0de7c53129caf312ec62a0faa9fb8157963 100644 (file)
@@ -1500,6 +1500,7 @@ virCPUExpandFeatures;
 virCPUGetHost;
 virCPUGetHostIsSupported;
 virCPUGetModels;
+virCPUGetVendorForModel;
 virCPUProbeHost;
 virCPUTranslate;
 virCPUUpdate;
index 5af5de8fc5a058618fccb4d01566508ca55a26ae..ccd274b80dea38b723ca51910c8326a1e56da240 100644 (file)
@@ -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;