mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-12 15:52:55 +00:00
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.
This commit is contained in:
parent
da0d82d15f
commit
043ba4a40a
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user