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(a)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