{
virQEMUDriverPtr driver = opaque;
virQEMUCapsPtr qemuCaps = NULL;
- size_t topologycpus;
+ unsigned int topologycpus;
int ret = -1;
if (!(qemuCaps = virQEMUCapsCacheLookup(caps,
}
/* 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;
}
}
unsigned int nvcpus)
{
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
+ unsigned int topologycpus;
int ret = -1;
if (def) {
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 */