]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
cpu: Add list of allowed CPU models to virCPUGetHost
authorJiri Denemark <jdenemar@redhat.com>
Tue, 7 Mar 2017 11:20:01 +0000 (12:20 +0100)
committerJiri Denemark <jdenemar@redhat.com>
Mon, 13 Mar 2017 22:49:57 +0000 (23:49 +0100)
When creating host CPU definition usable with a given emulator, the CPU
should not be defined using an unsupported CPU model. The new @models
and @nmodels parameters can be used to limit CPU models which can be
used in the result.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
src/bhyve/bhyve_capabilities.c
src/cpu/cpu.c
src/cpu/cpu.h
src/cpu/cpu_ppc64.c
src/cpu/cpu_x86.c
src/qemu/qemu_capabilities.c
src/vmware/vmware_conf.c
src/vz/vz_driver.c

index 29a2fe2856d0dddfa2cae5fc7e46a5e09d3f7870..cfcbde9d181eb288a4aa39652a6388f1e4436d33 100644 (file)
@@ -50,7 +50,8 @@ virBhyveCapsInitCPU(virCapsPtr caps,
     if (nodeGetInfo(&nodeinfo))
         return -1;
 
-    if (!(caps->host.cpu = virCPUGetHost(arch, VIR_CPU_TYPE_HOST, &nodeinfo)))
+    if (!(caps->host.cpu = virCPUGetHost(arch, VIR_CPU_TYPE_HOST,
+                                         &nodeinfo, NULL, 0)))
         return -1;
 
     return 0;
index 110bb240cf813f8abadf145247f6e1f11defb793..5b1940b47f9d4aaf29dc1dca5115c339b67d04be 100644 (file)
@@ -362,6 +362,8 @@ virCPUDataFree(virCPUDataPtr data)
  * @arch: CPU architecture
  * @type: requested type of the CPU
  * @nodeInfo: simplified CPU topology (optional)
+ * @models: list of CPU models that can be considered for host CPU
+ * @nmodels: number of CPU models in @models
  *
  * Create CPU definition describing the host's CPU.
  *
@@ -378,18 +380,26 @@ virCPUDataFree(virCPUDataPtr data)
  * host CPU model. In other words, a CPU definition containing just the
  * topology is a successful result even if detecting the host CPU model fails.
  *
+ * It possible to limit the CPU model which may appear in the created CPU
+ * definition by passing non-NULL @models list. This is useful when requesting
+ * a CPU model usable on a specific hypervisor. If @models is NULL, any CPU
+ * model known to libvirt may appear in the result.
+ *
  * Returns host CPU definition or NULL on error.
  */
 virCPUDefPtr
 virCPUGetHost(virArch arch,
               virCPUType type,
-              virNodeInfoPtr nodeInfo)
+              virNodeInfoPtr nodeInfo,
+              const char **models,
+              unsigned int nmodels)
 {
     struct cpuArchDriver *driver;
     virCPUDefPtr cpu = NULL;
 
-    VIR_DEBUG("arch=%s, type=%s, nodeInfo=%p",
-              virArchToString(arch), virCPUTypeToString(type), nodeInfo);
+    VIR_DEBUG("arch=%s, type=%s, nodeInfo=%p, models=%p, nmodels=%u",
+              virArchToString(arch), virCPUTypeToString(type), nodeInfo,
+              models, nmodels);
 
     if (!(driver = cpuGetSubDriver(arch)))
         return NULL;
@@ -431,7 +441,8 @@ virCPUGetHost(virArch arch,
      * filled in.
      */
     if (driver->getHost) {
-        if (driver->getHost(cpu) < 0 && !nodeInfo)
+        if (driver->getHost(cpu, models, nmodels) < 0 &&
+            !nodeInfo)
             goto error;
     } else if (nodeInfo) {
         VIR_DEBUG("cannot detect host CPU model for %s architecture",
index e5eca08c378293b4193bd169791b674d10e46f14..c329eb1349673d543482a6934b38d4f614ca083c 100644 (file)
@@ -71,7 +71,9 @@ typedef void
 (*cpuArchDataFree)  (virCPUDataPtr data);
 
 typedef int
-(*virCPUArchGetHost)(virCPUDefPtr cpu);
+(*virCPUArchGetHost)(virCPUDefPtr cpu,
+                     const char **models,
+                     unsigned int nmodels);
 
 typedef virCPUDefPtr
 (*cpuArchBaseline)  (virCPUDefPtr *cpus,
@@ -171,7 +173,9 @@ virCPUDataFree(virCPUDataPtr data);
 virCPUDefPtr
 virCPUGetHost(virArch arch,
               virCPUType type,
-              virNodeInfoPtr nodeInfo);
+              virNodeInfoPtr nodeInfo,
+              const char **models,
+              unsigned int nmodels);
 
 char *
 cpuBaselineXML(const char **xmlCPUs,
index bb715546b025c69034b80352678a2e42411bdbb5..6e16ffd1310316718aa6e19bab68a40cf9ffb3e3 100644 (file)
@@ -716,7 +716,9 @@ virCPUppc64DataFree(virCPUDataPtr data)
 
 
 static int
-virCPUppc64GetHost(virCPUDefPtr cpu)
+virCPUppc64GetHost(virCPUDefPtr cpu,
+                   const char **models,
+                   unsigned int nmodels)
 {
     virCPUDataPtr cpuData = NULL;
     virCPUppc64Data *data;
@@ -738,7 +740,7 @@ virCPUppc64GetHost(virCPUDefPtr cpu)
 #endif
     data->pvr[0].mask = 0xfffffffful;
 
-    ret = ppc64DriverDecode(cpu, cpuData, NULL, 0, NULL, 0);
+    ret = ppc64DriverDecode(cpu, cpuData, models, nmodels, NULL, 0);
 
  cleanup:
     virCPUppc64DataFree(cpuData);
index bddb169bada4e48af5d93a92b33ff1425b3beb37..6719acee253ae3b4bfefcc8cc31564ca33fe754d 100644 (file)
@@ -2438,7 +2438,9 @@ cpuidSet(uint32_t base, virCPUDataPtr data)
 
 
 static int
-virCPUx86GetHost(virCPUDefPtr cpu)
+virCPUx86GetHost(virCPUDefPtr cpu,
+                 const char **models,
+                 unsigned int nmodels)
 {
     virCPUDataPtr cpuData = NULL;
     int ret = -1;
@@ -2450,7 +2452,7 @@ virCPUx86GetHost(virCPUDefPtr cpu)
         cpuidSet(CPUX86_EXTENDED, cpuData) < 0)
         goto cleanup;
 
-    ret = x86DecodeCPUData(cpu, cpuData, NULL, 0, NULL, 0);
+    ret = x86DecodeCPUData(cpu, cpuData, models, nmodels, NULL, 0);
 
  cleanup:
     virCPUx86DataFree(cpuData);
index b39014224975a2f9e44a37dd2f52f3e028117da4..319600c3049f9f474e3b3315226d0dc44eea6071 100644 (file)
@@ -1070,7 +1070,8 @@ virQEMUCapsInitCPU(virCapsPtr caps,
     if (nodeGetInfo(&nodeinfo))
         return -1;
 
-    if (!(caps->host.cpu = virCPUGetHost(arch, VIR_CPU_TYPE_HOST, &nodeinfo)))
+    if (!(caps->host.cpu = virCPUGetHost(arch, VIR_CPU_TYPE_HOST,
+                                         &nodeinfo, NULL, 0)))
         return -1;
 
     return 0;
index cb6d60724a5a56f6e304eb4189bdabf9353572b0..659c4737a30166870a52abe941959a8d4461f05b 100644 (file)
@@ -82,7 +82,8 @@ vmwareCapsInit(void)
                                       NULL, NULL, 0, NULL) == NULL)
         goto error;
 
-    if (!(cpu = virCPUGetHost(caps->host.arch, VIR_CPU_TYPE_HOST, NULL)))
+    if (!(cpu = virCPUGetHost(caps->host.arch, VIR_CPU_TYPE_HOST,
+                              NULL, NULL, 0)))
         goto error;
 
     /* x86_64 guests are supported if
index 67ec2727b669a3142a200d6935a723e5edf84867..b5d2964f34fb5ad2e125d000ef75ea5330a24df8 100644 (file)
@@ -130,7 +130,7 @@ vzBuildCapabilities(void)
         goto error;
 
     if (!(caps->host.cpu = virCPUGetHost(caps->host.arch, VIR_CPU_TYPE_HOST,
-                                         &nodeinfo)))
+                                         &nodeinfo, NULL, 0)))
         goto error;
 
     if (virCapabilitiesAddHostMigrateTransport(caps, "vzmigr") < 0)