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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxx>
---
 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




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux