提交 93114485 编写于 作者: A Andrea Bolognani

qemu: Figure out nodeset bitmap size correctly

The current private XML parsing code relies on the assumption
that NUMA node IDs start from 0 and are densely allocated,
neither of which is necessarily the case.

Change it so that the bitmap size is dynamically calculated by
looking at NUMA node IDs instead, which ensures all nodes will
be able to fit and thus the bitmap will be parsed successfully.

Update one of the test cases so that it would fail with the
previous approach, but passes with the new one.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1490158Signed-off-by: NAndrea Bolognani <abologna@redhat.com>
Reviewed-by: NJán Tomko <jtomko@redhat.com>
上级 4fe4ffdb
......@@ -2236,6 +2236,8 @@ qemuDomainObjPrivateXMLParseAutomaticPlacement(xmlXPathContextPtr ctxt,
virCapsPtr caps = NULL;
char *nodeset;
char *cpuset;
int nodesetSize = 0;
size_t i;
int ret = -1;
nodeset = virXPathString("string(./numad/@nodeset)", ctxt);
......@@ -2247,8 +2249,14 @@ qemuDomainObjPrivateXMLParseAutomaticPlacement(xmlXPathContextPtr ctxt,
if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
goto cleanup;
/* Figure out how big the nodeset bitmap needs to be.
* This is necessary because NUMA node IDs are not guaranteed to
* start from 0 or be densely allocated */
for (i = 0; i < caps->host.nnumaCell; i++)
nodesetSize = MAX(nodesetSize, caps->host.numaCell[i]->num + 1);
if (nodeset &&
virBitmapParse(nodeset, &priv->autoNodeset, caps->host.nnumaCell_max) < 0)
virBitmapParse(nodeset, &priv->autoNodeset, nodesetSize) < 0)
goto cleanup;
if (cpuset) {
......
......@@ -252,7 +252,7 @@
<device alias='usb'/>
<device alias='ide0-0-0'/>
</devices>
<numad nodeset='0' cpuset='0-7'/>
<numad nodeset='6' cpuset='0-7'/>
<libDir path='/var/lib/libvirt/qemu/domain-1-upstream'/>
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target/domain-1-upstream'/>
<chardevStdioLogd/>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册