The empty NUMA nodes, where no memory resides, are allowed on ARM64 virt platform. However, QEMU fails to boot because the device-tree can't be populated due to the conflicting device-tree node names of these empty NUMA nodes. For example, QEMU fails to boot and the following error message reported when below command line is used.
/home/gavin/sandbox/qemu.main/build/qemu-system-aarch64 \ -accel kvm -machine virt,gic-version=host \ -cpu host -smp 4,sockets=2,cores=2,threads=1 \ -m 1024M,slots=16,maxmem=64G \ -object memory-backend-ram,id=mem0,size=512M \ -object memory-backend-ram,id=mem1,size=512M \ -numa node,nodeid=0,cpus=0-1,memdev=mem0 \ -numa node,nodeid=1,cpus=2-3,memdev=mem1 \ -numa node,nodeid=2 \ -numa node,nodeid=3 \ : qemu-system-aarch64: FDT: Failed to create subnode /memory@80000000: FDT_ERR_EXISTS The lastest device-tree specification doesn't indicate how the device-tree nodes should be populated for these empty NUMA nodes. The proposed way to handle this is documented in linux kernel. The linux kernel patches have been acknoledged and merged to upstream pretty soon. https://lkml.org/lkml/2021/9/27/31 This series follows the suggestion, which is included in linux kernel patches, to resolve the QEMU boot failure issue: The corresponding device-tree nodes aren't created for the empty NUMA nodes, but their NUMA IDs and distance map matrix should be included in the distance-map device-tree node. Changelog ========= v2: * Amend PATCH[01/02]'s changelog to explain why we needn't switch to disable generating the default distance map (Drew) Gavin Shan (2): numa: Set default distance map if needed hw/arm/virt: Don't create device-tree node for empty NUMA node hw/arm/boot.c | 4 ++++ hw/core/numa.c | 13 +++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) -- 2.23.0