]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Allow to define NUMA nodes without memory or CPUs assigned
authorAndrea Righi <arighi@nvidia.com>
Sat, 6 Sep 2025 13:08:57 +0000 (15:08 +0200)
committerDaniel P. Berrangé <berrange@redhat.com>
Mon, 8 Sep 2025 17:06:33 +0000 (18:06 +0100)
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.

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Andrea Righi <arighi@nvidia.com>
src/conf/numa_conf.c
src/qemu/qemu_command.c

index 00f0c605ee3b77104854206fd94bc68f4b17631d..5b50f3e3f5cf730fdc0674d7d3f1d3b0d11ee265 100644 (file)
@@ -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++) {
index e8de386f30fc417250e9c571f8827602e2eca08b..3f9b5839859667e978490a2f22c13a9f3711d935 100644 (file)
@@ -7820,7 +7820,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;
@@ -7828,8 +7830,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],
@@ -7857,11 +7860,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);
     }