From: Peter Krempa Date: Mon, 10 Oct 2016 13:57:54 +0000 (+0200) Subject: qemu: Reuse virDomainDeGetVcpusTopology to calculate total vcpu count X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=043ba4a40a4ae26cf616146d0d1c129d65b156b8;p=libvirt.git qemu: Reuse virDomainDeGetVcpusTopology to calculate total vcpu count Rather than multiplying sockets, cores, and threads use the new helper for getting the vcpu count resulting from the topology. --- diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 2b24c01112..83ac3896c3 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -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; } } diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 29a7e3fae5..e6f845de6a 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -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 */