mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 21:55:25 +00:00
qemu: -numa doesn't (yet) support disjoint range
https://bugzilla.redhat.com/show_bug.cgi?id=896092 mentions that qemu 1.4 and earlier only accept a simple start-stop range for the cpu=... argument of -numa. Libvirt would attempt to use -numa cpu=1,3 for a disjoint range, which did not work as intended. Upstream qemu will be adding a new syntax for disjoint cpu ranges in 1.5; but the design for that syntax is still under discussion at the time of this patch. So for libvirt 1.0.3, it is safest to just reject attempts to build an invalid qemu command line; in the future, we can add a capability bit and translate to the final accepted design for selecting a disjoint cpu range in numa. * src/qemu/qemu_command.c (qemuBuildNumaArgStr): Reject disjoint ranges.
This commit is contained in:
parent
db2536a627
commit
25dc8ba08b
@ -4756,32 +4756,47 @@ qemuBuildNumaArgStr(const virDomainDefPtr def, virCommandPtr cmd)
|
||||
{
|
||||
int i;
|
||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
||||
char *cpumask;
|
||||
char *cpumask = NULL;
|
||||
int ret = -1;
|
||||
|
||||
for (i = 0; i < def->cpu->ncells; i++) {
|
||||
VIR_FREE(cpumask);
|
||||
virCommandAddArg(cmd, "-numa");
|
||||
virBufferAsprintf(&buf, "node,nodeid=%d", def->cpu->cells[i].cellid);
|
||||
virBufferAddLit(&buf, ",cpus=");
|
||||
cpumask = virBitmapFormat(def->cpu->cells[i].cpumask);
|
||||
if (cpumask) {
|
||||
virBufferAsprintf(&buf, "%s", cpumask);
|
||||
VIR_FREE(cpumask);
|
||||
/* Up through qemu 1.4, -numa does not accept a cpus
|
||||
* argument any more complex than start-stop.
|
||||
*
|
||||
* XXX For qemu 1.5, the syntax has not yet been decided;
|
||||
* but when it is, we need a capability bit and
|
||||
* translation of our cpumask into the qemu syntax. */
|
||||
if (strchr(cpumask, ',')) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("disjoint NUMA cpu ranges are not supported "
|
||||
"with this QEMU"));
|
||||
goto cleanup;
|
||||
}
|
||||
virBufferAdd(&buf, cpumask, -1);
|
||||
}
|
||||
def->cpu->cells[i].mem = VIR_DIV_UP(def->cpu->cells[i].mem,
|
||||
1024) * 1024;
|
||||
virBufferAsprintf(&buf, ",mem=%d", def->cpu->cells[i].mem / 1024);
|
||||
|
||||
if (virBufferError(&buf))
|
||||
goto error;
|
||||
if (virBufferError(&buf)) {
|
||||
virReportOOMError();
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
virCommandAddArgBuffer(cmd, &buf);
|
||||
}
|
||||
return 0;
|
||||
ret = 0;
|
||||
|
||||
error:
|
||||
cleanup:
|
||||
VIR_FREE(cpumask);
|
||||
virBufferFreeAndReset(&buf);
|
||||
virReportOOMError();
|
||||
return -1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
|
Loading…
Reference in New Issue
Block a user