]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Reuse virDomainDeGetVcpusTopology to calculate total vcpu count
authorPeter Krempa <pkrempa@redhat.com>
Mon, 10 Oct 2016 13:57:54 +0000 (15:57 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 11 Oct 2016 11:52:09 +0000 (13:52 +0200)
Rather than multiplying sockets, cores, and threads use the new helper
for getting the vcpu count resulting from the topology.

src/qemu/qemu_domain.c
src/qemu/qemu_driver.c

index 2b24c01112d1cb1917e052754ffebd77f3abc423..83ac3896c391cb653874fd393fba4be80235591b 100644 (file)
@@ -2401,7 +2401,7 @@ qemuDomainDefValidate(const virDomainDef *def,
 {
     virQEMUDriverPtr driver = opaque;
     virQEMUCapsPtr qemuCaps = NULL;
-    size_t topologycpus;
+    unsigned int topologycpus;
     int ret = -1;
 
     if (!(qemuCaps = virQEMUCapsCacheLookup(caps,
@@ -2443,15 +2443,13 @@ qemuDomainDefValidate(const virDomainDef *def,
     }
 
     /* qemu as of 2.5.0 rejects SMP topologies that don't match the cpu count */
-    if (def->cpu && def->cpu->sockets) {
-        topologycpus = def->cpu->sockets * def->cpu->cores * def->cpu->threads;
-        if (topologycpus != virDomainDefGetVcpusMax(def)) {
-            /* presence of query-hotpluggable-cpus should be a good enough witness */
-            if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_HOTPLUGGABLE_CPUS)) {
-                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                               _("CPU topology doesn't match maximum vcpu count"));
-                goto cleanup;
-            }
+    if (virDomainDefGetVcpusTopology(def, &topologycpus) == 0 &&
+        topologycpus != virDomainDefGetVcpusMax(def)) {
+        /* presence of query-hotpluggable-cpus should be a good enough witness */
+        if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_HOTPLUGGABLE_CPUS)) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("CPU topology doesn't match maximum vcpu count"));
+            goto cleanup;
         }
     }
 
index 29a7e3fae5e2cf5cb3a47a99d01453fdddd50903..e6f845de6a8e42ff4f3cd08fe32e0b81f6be2eb1 100644 (file)
@@ -4718,6 +4718,7 @@ qemuDomainSetVcpusMax(virQEMUDriverPtr driver,
                       unsigned int nvcpus)
 {
     virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
+    unsigned int topologycpus;
     int ret = -1;
 
     if (def) {
@@ -4733,16 +4734,13 @@ qemuDomainSetVcpusMax(virQEMUDriverPtr driver,
         goto cleanup;
     }
 
-    if (persistentDef->cpu && persistentDef->cpu->sockets) {
+    if (virDomainDefGetVcpusTopology(persistentDef, &topologycpus) == 0 &&
+        nvcpus != topologycpus) {
         /* allow setting a valid vcpu count for the topology so an invalid
          * setting may be corrected via this API */
-        if (nvcpus != persistentDef->cpu->sockets *
-                      persistentDef->cpu->cores *
-                      persistentDef->cpu->threads) {
-            virReportError(VIR_ERR_INVALID_ARG, "%s",
-                           _("CPU topology doesn't match the desired vcpu count"));
-            goto cleanup;
-        }
+        virReportError(VIR_ERR_INVALID_ARG, "%s",
+                       _("CPU topology doesn't match the desired vcpu count"));
+        goto cleanup;
     }
 
     /* ordering information may become invalid, thus clear it */