Allow to define NUMA nodes without memory or CPUs assigned to properly
support the new acpi-generic-initiator device.
This is required because the NUMA nodes passed to the
acpi-generic-initiator object must be independent and not be shared with
other resources, such as CPU or memory.
Signed-off-by: Andrea Righi <arighi@nvidia.com>
---
src/conf/numa_conf.c | 3 +++
src/qemu/qemu_command.c | 19 +++++++++------
.../acpi-generic-initiator.x86_64-latest.args | 24 +++++++------------
3 files changed, 23 insertions(+), 23 deletions(-)
diff --git a/src/conf/numa_conf.c b/src/conf/numa_conf.c
index 00f0c605ee..5b50f3e3f5 100644
--- a/src/conf/numa_conf.c
+++ b/src/conf/numa_conf.c
@@ -1492,6 +1492,9 @@ virDomainNumaFillCPUsInNode(virDomainNuma *numa,
if (node >= virDomainNumaGetNodeCount(numa))
return -1;
+ if (virDomainNumaGetNodeMemorySize(numa, node) == 0)
+ return 0;
+
virBitmapSetAll(maxCPUsBitmap);
for (i = 0; i < numa->nmem_nodes; i++) {
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index cf9529dafc..46af5abd62 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -7818,7 +7818,9 @@ qemuBuildNumaCommandLine(virQEMUDriverConfig *cfg,
}
}
- if (masterInitiator < 0) {
+ /* HMAT requires a master initiator, so when it's enabled, ensure that
+ * at least one NUMA node has CPUs assigned. */
+ if (hmat && masterInitiator < 0) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("At least one NUMA node has to have CPUs"));
goto cleanup;
@@ -7826,8 +7828,9 @@ qemuBuildNumaCommandLine(virQEMUDriverConfig *cfg,
for (i = 0; i < ncells; i++) {
ssize_t initiator = virDomainNumaGetNodeInitiator(def->numa, i);
+ unsigned long long memSize = virDomainNumaGetNodeMemorySize(def->numa, i);
- if (needBackend) {
+ if (needBackend && memSize > 0) {
g_autoptr(virJSONValue) tcProps = NULL;
if (qemuBuildThreadContextProps(&tcProps, &nodeBackends[i],
@@ -7855,11 +7858,13 @@ qemuBuildNumaCommandLine(virQEMUDriverConfig *cfg,
virBufferAsprintf(&buf, ",initiator=%zd", initiator);
}
- if (needBackend)
- virBufferAsprintf(&buf, ",memdev=ram-node%zu", i);
- else
- virBufferAsprintf(&buf, ",mem=%llu",
- virDomainNumaGetNodeMemorySize(def->numa, i) / 1024);
+ if (memSize > 0) {
+ if (needBackend) {
+ virBufferAsprintf(&buf, ",memdev=ram-node%zu", i);
+ } else {
+ virBufferAsprintf(&buf, ",mem=%llu", memSize / 1024);
+ }
+ }
virCommandAddArgBuffer(cmd, &buf);
}
diff --git a/tests/qemuxmlconfdata/acpi-generic-initiator.x86_64-latest.args b/tests/qemuxmlconfdata/acpi-generic-initiator.x86_64-latest.args
index 1a8ac0dfc7..37712fb68d 100644
--- a/tests/qemuxmlconfdata/acpi-generic-initiator.x86_64-latest.args
+++ b/tests/qemuxmlconfdata/acpi-generic-initiator.x86_64-latest.args
@@ -18,22 +18,14 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest2/.config \
-smp 16,sockets=16,cores=1,threads=1 \
-object '{"qom-type":"memory-backend-ram","id":"ram-node0","size":8589934592}' \
-numa node,nodeid=0,cpus=0-15,memdev=ram-node0 \
--object '{"qom-type":"memory-backend-ram","id":"ram-node1","size":0}' \
--numa node,nodeid=1,memdev=ram-node1 \
--object '{"qom-type":"memory-backend-ram","id":"ram-node2","size":0}' \
--numa node,nodeid=2,memdev=ram-node2 \
--object '{"qom-type":"memory-backend-ram","id":"ram-node3","size":0}' \
--numa node,nodeid=3,memdev=ram-node3 \
--object '{"qom-type":"memory-backend-ram","id":"ram-node4","size":0}' \
--numa node,nodeid=4,memdev=ram-node4 \
--object '{"qom-type":"memory-backend-ram","id":"ram-node5","size":0}' \
--numa node,nodeid=5,memdev=ram-node5 \
--object '{"qom-type":"memory-backend-ram","id":"ram-node6","size":0}' \
--numa node,nodeid=6,memdev=ram-node6 \
--object '{"qom-type":"memory-backend-ram","id":"ram-node7","size":0}' \
--numa node,nodeid=7,memdev=ram-node7 \
--object '{"qom-type":"memory-backend-ram","id":"ram-node8","size":0}' \
--numa node,nodeid=8,memdev=ram-node8 \
+-numa node,nodeid=1 \
+-numa node,nodeid=2 \
+-numa node,nodeid=3 \
+-numa node,nodeid=4 \
+-numa node,nodeid=5 \
+-numa node,nodeid=6 \
+-numa node,nodeid=7 \
+-numa node,nodeid=8 \
-uuid c7a5fdbd-edaf-9466-926a-d65c16db1809 \
-display none \
-no-user-config \
--
2.50.1