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 <ari...@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

Reply via email to