提交 25dc8ba0 编写于 作者: E Eric Blake

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.
上级 db2536a6
...@@ -4756,32 +4756,47 @@ qemuBuildNumaArgStr(const virDomainDefPtr def, virCommandPtr cmd) ...@@ -4756,32 +4756,47 @@ qemuBuildNumaArgStr(const virDomainDefPtr def, virCommandPtr cmd)
{ {
int i; int i;
virBuffer buf = VIR_BUFFER_INITIALIZER; virBuffer buf = VIR_BUFFER_INITIALIZER;
char *cpumask; char *cpumask = NULL;
int ret = -1;
for (i = 0; i < def->cpu->ncells; i++) { for (i = 0; i < def->cpu->ncells; i++) {
VIR_FREE(cpumask);
virCommandAddArg(cmd, "-numa"); virCommandAddArg(cmd, "-numa");
virBufferAsprintf(&buf, "node,nodeid=%d", def->cpu->cells[i].cellid); virBufferAsprintf(&buf, "node,nodeid=%d", def->cpu->cells[i].cellid);
virBufferAddLit(&buf, ",cpus="); virBufferAddLit(&buf, ",cpus=");
cpumask = virBitmapFormat(def->cpu->cells[i].cpumask); cpumask = virBitmapFormat(def->cpu->cells[i].cpumask);
if (cpumask) { if (cpumask) {
virBufferAsprintf(&buf, "%s", cpumask); /* Up through qemu 1.4, -numa does not accept a cpus
VIR_FREE(cpumask); * 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, def->cpu->cells[i].mem = VIR_DIV_UP(def->cpu->cells[i].mem,
1024) * 1024; 1024) * 1024;
virBufferAsprintf(&buf, ",mem=%d", def->cpu->cells[i].mem / 1024); virBufferAsprintf(&buf, ",mem=%d", def->cpu->cells[i].mem / 1024);
if (virBufferError(&buf)) if (virBufferError(&buf)) {
goto error; virReportOOMError();
goto cleanup;
}
virCommandAddArgBuffer(cmd, &buf); virCommandAddArgBuffer(cmd, &buf);
} }
return 0; ret = 0;
error: cleanup:
VIR_FREE(cpumask);
virBufferFreeAndReset(&buf); virBufferFreeAndReset(&buf);
virReportOOMError(); return ret;
return -1;
} }
static int static int
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册