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