[PATCH 1/2] qemu: Allow to define NUMA nodes without memory or CPUs assigned

Andrea Righi via Devel posted 2 patches 12 months ago
There is a newer version of this series
[PATCH 1/2] qemu: Allow to define NUMA nodes without memory or CPUs assigned
Posted by Andrea Righi via Devel 12 months ago
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 | 22 ++++++++++++++--------
 2 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/src/conf/numa_conf.c b/src/conf/numa_conf.c
index 0a0e2911f7..0b311c9416 100644
--- a/src/conf/numa_conf.c
+++ b/src/conf/numa_conf.c
@@ -1498,6 +1498,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 7370711918..03d0676f45 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -7567,16 +7567,20 @@ 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"));
+                      _("At least one NUMA node has to have CPUs"));
         goto cleanup;
     }
 
     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],
@@ -7606,11 +7610,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);
     }
-- 
2.48.1