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 | 18 ++++++++----------
src/qemu/qemu_driver.c | 14 ++++++--------
2 files changed, 14 insertions(+), 18 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 2b24c01..83ac389 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 29a7e3f..e6f845d 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 */
--
2.10.0