]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
cpu: Add virCPUType parameter to virCPUGetHost
authorJiri Denemark <jdenemar@redhat.com>
Tue, 7 Mar 2017 10:38:38 +0000 (11:38 +0100)
committerJiri Denemark <jdenemar@redhat.com>
Mon, 13 Mar 2017 22:49:57 +0000 (23:49 +0100)
The parameter can be used to request either VIR_CPU_TYPE_HOST (which has
been assumed so far) or VIR_CPU_TYPE_GUEST definition.

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

index 71353fe147d505ec78fb9ae9edb62a61ecb67883..29a2fe2856d0dddfa2cae5fc7e46a5e09d3f7870 100644 (file)
@@ -50,7 +50,7 @@ virBhyveCapsInitCPU(virCapsPtr caps,
     if (nodeGetInfo(&nodeinfo))
         return -1;
 
-    if (!(caps->host.cpu = virCPUGetHost(arch, &nodeinfo)))
+    if (!(caps->host.cpu = virCPUGetHost(arch, VIR_CPU_TYPE_HOST, &nodeinfo)))
         return -1;
 
     return 0;
index c1666ed3bf108ae53d7a0fc9c3c971f2a2b16ef4..110bb240cf813f8abadf145247f6e1f11defb793 100644 (file)
@@ -360,9 +360,18 @@ virCPUDataFree(virCPUDataPtr data)
  * virCPUGetHost:
  *
  * @arch: CPU architecture
+ * @type: requested type of the CPU
  * @nodeInfo: simplified CPU topology (optional)
  *
- * Create CPU definition describing the host's CPU. If @nodeInfo is not NULL,
+ * Create CPU definition describing the host's CPU.
+ *
+ * The @type (either VIR_CPU_TYPE_HOST or VIR_CPU_TYPE_GUEST) specifies what
+ * type of CPU definition should be created. Specifically, VIR_CPU_TYPE_HOST
+ * CPUs may contain only features without any policy attribute. Requesting
+ * VIR_CPU_TYPE_GUEST provides better results because the CPU is allowed to
+ * contain disabled features.
+ *
+ * If @nodeInfo is not NULL (which is only allowed for VIR_CPU_TYPE_HOST CPUs),
  * the CPU definition will have topology (sockets, cores, threads) filled in
  * according to the content of @nodeInfo. The function fails only if @nodeInfo
  * was not passed in and the assigned CPU driver was not able to detect the
@@ -373,13 +382,14 @@ virCPUDataFree(virCPUDataPtr data)
  */
 virCPUDefPtr
 virCPUGetHost(virArch arch,
+              virCPUType type,
               virNodeInfoPtr nodeInfo)
 {
     struct cpuArchDriver *driver;
     virCPUDefPtr cpu = NULL;
 
-    VIR_DEBUG("arch=%s, nodeInfo=%p",
-              virArchToString(arch), nodeInfo);
+    VIR_DEBUG("arch=%s, type=%s, nodeInfo=%p",
+              virArchToString(arch), virCPUTypeToString(type), nodeInfo);
 
     if (!(driver = cpuGetSubDriver(arch)))
         return NULL;
@@ -387,8 +397,29 @@ virCPUGetHost(virArch arch,
     if (VIR_ALLOC(cpu) < 0)
         return NULL;
 
-    cpu->arch = arch;
-    cpu->type = VIR_CPU_TYPE_HOST;
+    switch (type) {
+    case VIR_CPU_TYPE_HOST:
+        cpu->arch = arch;
+        cpu->type = type;
+        break;
+
+    case VIR_CPU_TYPE_GUEST:
+        if (nodeInfo) {
+            virReportError(VIR_ERR_INVALID_ARG,
+                           _("cannot set topology for CPU type '%s'"),
+                           virCPUTypeToString(type));
+            goto error;
+        }
+        cpu->type = type;
+        break;
+
+    case VIR_CPU_TYPE_AUTO:
+    case VIR_CPU_TYPE_LAST:
+        virReportError(VIR_ERR_INVALID_ARG,
+                       _("unsupported CPU type: %s"),
+                       virCPUTypeToString(type));
+        goto error;
+    }
 
     if (nodeInfo) {
         cpu->sockets = nodeInfo->sockets;
index cbbb45223a75da3abb5036870e354e00d036bb63..e5eca08c378293b4193bd169791b674d10e46f14 100644 (file)
@@ -170,6 +170,7 @@ virCPUDataFree(virCPUDataPtr data);
 
 virCPUDefPtr
 virCPUGetHost(virArch arch,
+              virCPUType type,
               virNodeInfoPtr nodeInfo);
 
 char *
index b0a4861c3e65a3b4bd801c14bebb3fde94742f30..b39014224975a2f9e44a37dd2f52f3e028117da4 100644 (file)
@@ -1070,7 +1070,7 @@ virQEMUCapsInitCPU(virCapsPtr caps,
     if (nodeGetInfo(&nodeinfo))
         return -1;
 
-    if (!(caps->host.cpu = virCPUGetHost(arch, &nodeinfo)))
+    if (!(caps->host.cpu = virCPUGetHost(arch, VIR_CPU_TYPE_HOST, &nodeinfo)))
         return -1;
 
     return 0;
index d1444e4625ea8a9850ce1dbbe5be9796b9cb9d2c..cb6d60724a5a56f6e304eb4189bdabf9353572b0 100644 (file)
@@ -82,7 +82,7 @@ vmwareCapsInit(void)
                                       NULL, NULL, 0, NULL) == NULL)
         goto error;
 
-    if (!(cpu = virCPUGetHost(caps->host.arch, NULL)))
+    if (!(cpu = virCPUGetHost(caps->host.arch, VIR_CPU_TYPE_HOST, NULL)))
         goto error;
 
     /* x86_64 guests are supported if
index f97a2045b961a41c30b045eca00aed78384ba180..67ec2727b669a3142a200d6935a723e5edf84867 100644 (file)
@@ -129,7 +129,8 @@ vzBuildCapabilities(void)
     if (nodeGetInfo(&nodeinfo))
         goto error;
 
-    if (!(caps->host.cpu = virCPUGetHost(caps->host.arch, &nodeinfo)))
+    if (!(caps->host.cpu = virCPUGetHost(caps->host.arch, VIR_CPU_TYPE_HOST,
+                                         &nodeinfo)))
         goto error;
 
     if (virCapabilitiesAddHostMigrateTransport(caps, "vzmigr") < 0)