[PATCH] qemu: Don't generate '-machine memory-backend' and '-numa memdev'

In 88957116c9 I've switched to -machine memory-backend=ID and -object memory-backend-* because QEMU is obsoleting -mem-path and -mem-prealloc. However, what I did not foresee was that using -machine memory-backend in combination with -numa is not allowed in QEMU. This was reported upstream and fortunately not released yet. The solution is to generate -machine memory-backend=ID iff there are no guest NUMA nodes, and require use of -numa memdev= for new enough QEMUs. Reported-by: Masayoshi Mizuma <msys.mizuma@gmail.com> Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/qemu/qemu_command.c | 11 +++++++++-- .../hugepages-nvdimm.x86_64-latest.args | 6 +----- .../memfd-memory-default-hugepage.x86_64-latest.args | 5 +---- .../memfd-memory-numa.x86_64-latest.args | 5 +---- .../memory-hotplug-nvdimm-access.x86_64-latest.args | 4 +--- .../memory-hotplug-nvdimm-align.x86_64-latest.args | 4 +--- .../memory-hotplug-nvdimm-label.x86_64-latest.args | 4 +--- .../memory-hotplug-nvdimm-pmem.x86_64-latest.args | 4 +--- .../memory-hotplug-nvdimm-readonly.x86_64-latest.args | 4 +--- .../memory-hotplug-nvdimm.x86_64-latest.args | 4 +--- .../qemuxml2argvdata/numatune-hmat.x86_64-latest.args | 4 +--- .../vhost-user-fs-fd-memory.x86_64-latest.args | 4 +--- .../vhost-user-fs-hugepages.x86_64-latest.args | 5 +---- .../vhost-user-gpu-secondary.x86_64-latest.args | 3 +-- .../vhost-user-vga.x86_64-latest.args | 3 +-- 15 files changed, 23 insertions(+), 47 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 476cf6972e..def79d2f20 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7049,7 +7049,8 @@ qemuBuildMachineCommandLine(virCommandPtr cmd, defaultRAMid = virQEMUCapsGetMachineDefaultRAMid(qemuCaps, def->virtType, def->os.machine); - if (defaultRAMid) + if (defaultRAMid && + !virDomainNumaGetNodeCount(def->numa)) virBufferAsprintf(&buf, ",memory-backend=%s", defaultRAMid); virCommandAddArgBuffer(cmd, &buf); @@ -7216,7 +7217,8 @@ qemuBuildMemCommandLine(virCommandPtr cmd, def->os.machine); if (defaultRAMid) { - qemuBuildMemCommandLineMemoryDefaultBackend(cmd, def, priv, defaultRAMid); + if (!virDomainNumaGetNodeCount(def->numa)) + qemuBuildMemCommandLineMemoryDefaultBackend(cmd, def, priv, defaultRAMid); } else { if (def->mem.allocation == VIR_DOMAIN_MEMORY_ALLOCATION_IMMEDIATE) { virCommandAddArgList(cmd, "-mem-prealloc", NULL); @@ -7428,6 +7430,11 @@ qemuBuildNumaCommandLine(virQEMUDriverConfigPtr cfg, hmat = true; } + if (virQEMUCapsGetMachineDefaultRAMid(qemuCaps, + def->virtType, + def->os.machine)) + needBackend = true; + nodeBackends = g_new0(virBuffer, ncells); /* using of -numa memdev= cannot be combined with -numa mem=, thus we diff --git a/tests/qemuxml2argvdata/hugepages-nvdimm.x86_64-latest.args b/tests/qemuxml2argvdata/hugepages-nvdimm.x86_64-latest.args index 192b033e9e..969bb713b5 100644 --- a/tests/qemuxml2argvdata/hugepages-nvdimm.x86_64-latest.args +++ b/tests/qemuxml2argvdata/hugepages-nvdimm.x86_64-latest.args @@ -12,13 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ --machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on,\ -memory-backend=pc.ram \ +-machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on \ -cpu qemu64 \ -m size=1048576k,slots=16,maxmem=1099511627776k \ --object memory-backend-file,id=pc.ram,\ -mem-path=/dev/hugepages2M/libvirt/qemu/-1-QEMUGuest1,share=yes,prealloc=yes,\ -size=1073741824 \ -overcommit mem-lock=off \ -smp 2,sockets=2,dies=1,cores=1,threads=1 \ -object memory-backend-file,id=ram-node0,\ diff --git a/tests/qemuxml2argvdata/memfd-memory-default-hugepage.x86_64-latest.args b/tests/qemuxml2argvdata/memfd-memory-default-hugepage.x86_64-latest.args index b43e7d9c3c..ef15e2e97e 100644 --- a/tests/qemuxml2argvdata/memfd-memory-default-hugepage.x86_64-latest.args +++ b/tests/qemuxml2argvdata/memfd-memory-default-hugepage.x86_64-latest.args @@ -12,12 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-instance-00000092/master-key.aes \ --machine pc-i440fx-2.3,accel=kvm,usb=off,dump-guest-core=off,\ -memory-backend=pc.ram \ +-machine pc-i440fx-2.3,accel=kvm,usb=off,dump-guest-core=off \ -cpu qemu64 \ -m 14336 \ --object memory-backend-memfd,id=pc.ram,hugetlb=yes,hugetlbsize=2097152,\ -share=yes,prealloc=yes,size=15032385536 \ -overcommit mem-lock=off \ -smp 8,sockets=1,dies=1,cores=8,threads=1 \ -object memory-backend-memfd,id=ram-node0,hugetlb=yes,hugetlbsize=2097152,\ diff --git a/tests/qemuxml2argvdata/memfd-memory-numa.x86_64-latest.args b/tests/qemuxml2argvdata/memfd-memory-numa.x86_64-latest.args index b43e7d9c3c..ef15e2e97e 100644 --- a/tests/qemuxml2argvdata/memfd-memory-numa.x86_64-latest.args +++ b/tests/qemuxml2argvdata/memfd-memory-numa.x86_64-latest.args @@ -12,12 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-instance-00000092/master-key.aes \ --machine pc-i440fx-2.3,accel=kvm,usb=off,dump-guest-core=off,\ -memory-backend=pc.ram \ +-machine pc-i440fx-2.3,accel=kvm,usb=off,dump-guest-core=off \ -cpu qemu64 \ -m 14336 \ --object memory-backend-memfd,id=pc.ram,hugetlb=yes,hugetlbsize=2097152,\ -share=yes,prealloc=yes,size=15032385536 \ -overcommit mem-lock=off \ -smp 8,sockets=1,dies=1,cores=8,threads=1 \ -object memory-backend-memfd,id=ram-node0,hugetlb=yes,hugetlbsize=2097152,\ diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-access.x86_64-latest.args b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-access.x86_64-latest.args index c5c5befdd5..8d3fa2e867 100644 --- a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-access.x86_64-latest.args +++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-access.x86_64-latest.args @@ -12,11 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ --machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on,\ -memory-backend=pc.ram \ +-machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on \ -cpu qemu64 \ -m size=219136k,slots=16,maxmem=1099511627776k \ --object memory-backend-ram,id=pc.ram,size=224395264 \ -overcommit mem-lock=off \ -smp 2,sockets=2,dies=1,cores=1,threads=1 \ -object memory-backend-ram,id=ram-node0,size=224395264 \ diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.x86_64-latest.args b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.x86_64-latest.args index 418bf1158d..4f22f78277 100644 --- a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.x86_64-latest.args +++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.x86_64-latest.args @@ -12,11 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ --machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on,\ -memory-backend=pc.ram \ +-machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on \ -cpu qemu64 \ -m size=219136k,slots=16,maxmem=1099511627776k \ --object memory-backend-ram,id=pc.ram,size=224395264 \ -overcommit mem-lock=off \ -smp 2,sockets=2,dies=1,cores=1,threads=1 \ -object memory-backend-ram,id=ram-node0,size=224395264 \ diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-label.x86_64-latest.args b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-label.x86_64-latest.args index 66477a2b09..53dda234a2 100644 --- a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-label.x86_64-latest.args +++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-label.x86_64-latest.args @@ -12,11 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ --machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on,\ -memory-backend=pc.ram \ +-machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on \ -cpu qemu64 \ -m size=219136k,slots=16,maxmem=1099511627776k \ --object memory-backend-ram,id=pc.ram,size=224395264 \ -overcommit mem-lock=off \ -smp 2,sockets=2,dies=1,cores=1,threads=1 \ -object memory-backend-ram,id=ram-node0,size=224395264 \ diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-pmem.x86_64-latest.args b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-pmem.x86_64-latest.args index 759d749c2e..cac02a6f6d 100644 --- a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-pmem.x86_64-latest.args +++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-pmem.x86_64-latest.args @@ -12,11 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ --machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on,\ -memory-backend=pc.ram \ +-machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on \ -cpu qemu64 \ -m size=219136k,slots=16,maxmem=1099511627776k \ --object memory-backend-ram,id=pc.ram,size=224395264 \ -overcommit mem-lock=off \ -smp 2,sockets=2,dies=1,cores=1,threads=1 \ -object memory-backend-ram,id=ram-node0,size=224395264 \ diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-readonly.x86_64-latest.args b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-readonly.x86_64-latest.args index b195b8625c..5e44496e39 100644 --- a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-readonly.x86_64-latest.args +++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-readonly.x86_64-latest.args @@ -12,11 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ --machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on,\ -memory-backend=pc.ram \ +-machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on \ -cpu qemu64 \ -m size=219136k,slots=16,maxmem=1099511627776k \ --object memory-backend-ram,id=pc.ram,size=224395264 \ -overcommit mem-lock=off \ -smp 2,sockets=2,dies=1,cores=1,threads=1 \ -object memory-backend-ram,id=ram-node0,size=224395264 \ diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm.x86_64-latest.args b/tests/qemuxml2argvdata/memory-hotplug-nvdimm.x86_64-latest.args index ae416d7c7f..94f8444d95 100644 --- a/tests/qemuxml2argvdata/memory-hotplug-nvdimm.x86_64-latest.args +++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm.x86_64-latest.args @@ -12,11 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ --machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on,\ -memory-backend=pc.ram \ +-machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on \ -cpu qemu64 \ -m size=1048576k,slots=16,maxmem=1099511627776k \ --object memory-backend-ram,id=pc.ram,size=1073741824 \ -overcommit mem-lock=off \ -smp 2,sockets=2,dies=1,cores=1,threads=1 \ -object memory-backend-ram,id=ram-node0,size=1073741824 \ diff --git a/tests/qemuxml2argvdata/numatune-hmat.x86_64-latest.args b/tests/qemuxml2argvdata/numatune-hmat.x86_64-latest.args index be4a9ed871..c52015caa8 100644 --- a/tests/qemuxml2argvdata/numatune-hmat.x86_64-latest.args +++ b/tests/qemuxml2argvdata/numatune-hmat.x86_64-latest.args @@ -12,11 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-QEMUGuest/master-key.aes \ --machine pc,accel=tcg,usb=off,dump-guest-core=off,hmat=on,\ -memory-backend=pc.ram \ +-machine pc,accel=tcg,usb=off,dump-guest-core=off,hmat=on \ -cpu qemu64 \ -m 12288 \ --object memory-backend-ram,id=pc.ram,size=12884901888 \ -overcommit mem-lock=off \ -smp 12,sockets=12,cores=1,threads=1 \ -object memory-backend-ram,id=ram-node0,size=2147483648 \ diff --git a/tests/qemuxml2argvdata/vhost-user-fs-fd-memory.x86_64-latest.args b/tests/qemuxml2argvdata/vhost-user-fs-fd-memory.x86_64-latest.args index 13359c91fe..dd5f68abc5 100644 --- a/tests/qemuxml2argvdata/vhost-user-fs-fd-memory.x86_64-latest.args +++ b/tests/qemuxml2argvdata/vhost-user-fs-fd-memory.x86_64-latest.args @@ -12,11 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-guest/master-key.aes \ --machine pc,accel=kvm,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-machine pc,accel=kvm,usb=off,dump-guest-core=off \ -cpu qemu64 \ -m 14336 \ --object memory-backend-file,id=pc.ram,\ -mem-path=/var/lib/libvirt/qemu/ram/-1-guest/pc.ram,share=yes,size=15032385536 \ -overcommit mem-lock=off \ -smp 2,sockets=2,cores=1,threads=1 \ -object memory-backend-file,id=ram-node0,\ diff --git a/tests/qemuxml2argvdata/vhost-user-fs-hugepages.x86_64-latest.args b/tests/qemuxml2argvdata/vhost-user-fs-hugepages.x86_64-latest.args index 59f45d466b..e4f5db7a63 100644 --- a/tests/qemuxml2argvdata/vhost-user-fs-hugepages.x86_64-latest.args +++ b/tests/qemuxml2argvdata/vhost-user-fs-hugepages.x86_64-latest.args @@ -12,12 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-guest/master-key.aes \ --machine q35,accel=tcg,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-machine q35,accel=tcg,usb=off,dump-guest-core=off \ -cpu qemu64 \ -m 2048 \ --object memory-backend-file,id=pc.ram,\ -mem-path=/dev/hugepages2M/libvirt/qemu/-1-guest,share=yes,prealloc=yes,\ -size=2147483648 \ -overcommit mem-lock=off \ -smp 2,sockets=2,cores=1,threads=1 \ -object memory-backend-file,id=ram-node0,\ diff --git a/tests/qemuxml2argvdata/vhost-user-gpu-secondary.x86_64-latest.args b/tests/qemuxml2argvdata/vhost-user-gpu-secondary.x86_64-latest.args index e7d3315b8f..e99a5342dc 100644 --- a/tests/qemuxml2argvdata/vhost-user-gpu-secondary.x86_64-latest.args +++ b/tests/qemuxml2argvdata/vhost-user-gpu-secondary.x86_64-latest.args @@ -12,10 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ --machine pc,accel=tcg,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-machine pc,accel=tcg,usb=off,dump-guest-core=off \ -cpu qemu64 \ -m 214 \ --object memory-backend-memfd,id=pc.ram,share=yes,size=224395264 \ -overcommit mem-lock=off \ -smp 1,sockets=1,cores=1,threads=1 \ -object memory-backend-memfd,id=ram-node0,share=yes,size=224395264 \ diff --git a/tests/qemuxml2argvdata/vhost-user-vga.x86_64-latest.args b/tests/qemuxml2argvdata/vhost-user-vga.x86_64-latest.args index df5b1b481d..277bf8c646 100644 --- a/tests/qemuxml2argvdata/vhost-user-vga.x86_64-latest.args +++ b/tests/qemuxml2argvdata/vhost-user-vga.x86_64-latest.args @@ -12,10 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ --machine pc,accel=tcg,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-machine pc,accel=tcg,usb=off,dump-guest-core=off \ -cpu qemu64 \ -m 214 \ --object memory-backend-memfd,id=pc.ram,share=yes,size=224395264 \ -overcommit mem-lock=off \ -smp 1,sockets=1,cores=1,threads=1 \ -object memory-backend-memfd,id=ram-node0,share=yes,size=224395264 \ -- 2.26.2

On Tue, Oct 06, 2020 at 10:03:29 +0200, Michal Privoznik wrote:
In 88957116c9 I've switched to -machine memory-backend=ID and -object memory-backend-* because QEMU is obsoleting -mem-path and -mem-prealloc. However, what I did not foresee was that using -machine memory-backend in combination with -numa is not allowed in QEMU. This was reported upstream and fortunately not released yet.
The solution is to generate -machine memory-backend=ID iff there
s/iff/only if/
are no guest NUMA nodes, and require use of -numa memdev= for new enough QEMUs.
To me it's not obvious enough from this commit message that the root of the problem is that for NUMA configurations we already specify the memory via memory-backend thus actually adding another memory backend for non-numa config would be wrong anyways.
Reported-by: Masayoshi Mizuma <msys.mizuma@gmail.com> Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/qemu/qemu_command.c | 11 +++++++++-- .../hugepages-nvdimm.x86_64-latest.args | 6 +----- .../memfd-memory-default-hugepage.x86_64-latest.args | 5 +---- .../memfd-memory-numa.x86_64-latest.args | 5 +---- .../memory-hotplug-nvdimm-access.x86_64-latest.args | 4 +--- .../memory-hotplug-nvdimm-align.x86_64-latest.args | 4 +--- .../memory-hotplug-nvdimm-label.x86_64-latest.args | 4 +--- .../memory-hotplug-nvdimm-pmem.x86_64-latest.args | 4 +--- .../memory-hotplug-nvdimm-readonly.x86_64-latest.args | 4 +--- .../memory-hotplug-nvdimm.x86_64-latest.args | 4 +--- .../qemuxml2argvdata/numatune-hmat.x86_64-latest.args | 4 +--- .../vhost-user-fs-fd-memory.x86_64-latest.args | 4 +--- .../vhost-user-fs-hugepages.x86_64-latest.args | 5 +---- .../vhost-user-gpu-secondary.x86_64-latest.args | 3 +-- .../vhost-user-vga.x86_64-latest.args | 3 +-- 15 files changed, 23 insertions(+), 47 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 476cf6972e..def79d2f20 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7049,7 +7049,8 @@ qemuBuildMachineCommandLine(virCommandPtr cmd, defaultRAMid = virQEMUCapsGetMachineDefaultRAMid(qemuCaps, def->virtType, def->os.machine); - if (defaultRAMid) + if (defaultRAMid && + !virDomainNumaGetNodeCount(def->numa)) virBufferAsprintf(&buf, ",memory-backend=%s", defaultRAMid);
virCommandAddArgBuffer(cmd, &buf);
IMO this is starting to be too arcane. Since 'defaultRAMid' is used to gate the formatting of the command line attribute and it's used only there you can move the !virDomainNumaGetNodeCount condition and just don't query the defaultRAMid. Also please add a comment describing what is happening, especially why the numa nodes influence this.
@@ -7216,7 +7217,8 @@ qemuBuildMemCommandLine(virCommandPtr cmd, def->os.machine);
if (defaultRAMid) { - qemuBuildMemCommandLineMemoryDefaultBackend(cmd, def, priv, defaultRAMid); + if (!virDomainNumaGetNodeCount(def->numa)) + qemuBuildMemCommandLineMemoryDefaultBackend(cmd, def, priv, defaultRAMid); } else { if (def->mem.allocation == VIR_DOMAIN_MEMORY_ALLOCATION_IMMEDIATE) { virCommandAddArgList(cmd, "-mem-prealloc", NULL);
Same here.
@@ -7428,6 +7430,11 @@ qemuBuildNumaCommandLine(virQEMUDriverConfigPtr cfg, hmat = true; }
+ if (virQEMUCapsGetMachineDefaultRAMid(qemuCaps, + def->virtType, + def->os.machine)) + needBackend = true;
Does this even make sense to have here? In case we are formatting NUMA we should stick to the rules about NUMA node formatting and this doesn't seem to fit. Aditionally I'd expect that it's redundant since the condition involving virQEMUCapsGetMachineNumaMemSupported will already assert needBackend for any modern qemu. If it makes sense please make sure to note it down.
+ nodeBackends = g_new0(virBuffer, ncells);
/* using of -numa memdev= cannot be combined with -numa mem=, thus we

Hi Michal, On Tue, Oct 06, 2020 at 10:03:29AM +0200, Michal Privoznik wrote:
In 88957116c9 I've switched to -machine memory-backend=ID and -object memory-backend-* because QEMU is obsoleting -mem-path and -mem-prealloc. However, what I did not foresee was that using -machine memory-backend in combination with -numa is not allowed in QEMU. This was reported upstream and fortunately not released yet.
The solution is to generate -machine memory-backend=ID iff there are no guest NUMA nodes, and require use of -numa memdev= for new enough QEMUs.
Reported-by: Masayoshi Mizuma <msys.mizuma@gmail.com> Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/qemu/qemu_command.c | 11 +++++++++-- .../hugepages-nvdimm.x86_64-latest.args | 6 +----- .../memfd-memory-default-hugepage.x86_64-latest.args | 5 +---- .../memfd-memory-numa.x86_64-latest.args | 5 +---- .../memory-hotplug-nvdimm-access.x86_64-latest.args | 4 +--- .../memory-hotplug-nvdimm-align.x86_64-latest.args | 4 +--- .../memory-hotplug-nvdimm-label.x86_64-latest.args | 4 +--- .../memory-hotplug-nvdimm-pmem.x86_64-latest.args | 4 +--- .../memory-hotplug-nvdimm-readonly.x86_64-latest.args | 4 +--- .../memory-hotplug-nvdimm.x86_64-latest.args | 4 +--- .../qemuxml2argvdata/numatune-hmat.x86_64-latest.args | 4 +--- .../vhost-user-fs-fd-memory.x86_64-latest.args | 4 +--- .../vhost-user-fs-hugepages.x86_64-latest.args | 5 +---- .../vhost-user-gpu-secondary.x86_64-latest.args | 3 +-- .../vhost-user-vga.x86_64-latest.args | 3 +-- 15 files changed, 23 insertions(+), 47 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 476cf6972e..def79d2f20 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7049,7 +7049,8 @@ qemuBuildMachineCommandLine(virCommandPtr cmd, defaultRAMid = virQEMUCapsGetMachineDefaultRAMid(qemuCaps, def->virtType, def->os.machine); - if (defaultRAMid) + if (defaultRAMid && + !virDomainNumaGetNodeCount(def->numa)) virBufferAsprintf(&buf, ",memory-backend=%s", defaultRAMid);
virCommandAddArgBuffer(cmd, &buf); @@ -7216,7 +7217,8 @@ qemuBuildMemCommandLine(virCommandPtr cmd, def->os.machine);
if (defaultRAMid) { - qemuBuildMemCommandLineMemoryDefaultBackend(cmd, def, priv, defaultRAMid); + if (!virDomainNumaGetNodeCount(def->numa)) + qemuBuildMemCommandLineMemoryDefaultBackend(cmd, def, priv, defaultRAMid); } else { if (def->mem.allocation == VIR_DOMAIN_MEMORY_ALLOCATION_IMMEDIATE) { virCommandAddArgList(cmd, "-mem-prealloc", NULL); @@ -7428,6 +7430,11 @@ qemuBuildNumaCommandLine(virQEMUDriverConfigPtr cfg, hmat = true; }
+ if (virQEMUCapsGetMachineDefaultRAMid(qemuCaps, + def->virtType, + def->os.machine)) + needBackend = true; + nodeBackends = g_new0(virBuffer, ncells);
/* using of -numa memdev= cannot be combined with -numa mem=, thus we
Thank you for the patch, it works well! Please feel free to add: Tested-by: Masayoshi Mizuma <m.mizuma@jp.fujitsu.com> Thanks! Masa
diff --git a/tests/qemuxml2argvdata/hugepages-nvdimm.x86_64-latest.args b/tests/qemuxml2argvdata/hugepages-nvdimm.x86_64-latest.args index 192b033e9e..969bb713b5 100644 --- a/tests/qemuxml2argvdata/hugepages-nvdimm.x86_64-latest.args +++ b/tests/qemuxml2argvdata/hugepages-nvdimm.x86_64-latest.args @@ -12,13 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ --machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on,\ -memory-backend=pc.ram \ +-machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on \ -cpu qemu64 \ -m size=1048576k,slots=16,maxmem=1099511627776k \ --object memory-backend-file,id=pc.ram,\ -mem-path=/dev/hugepages2M/libvirt/qemu/-1-QEMUGuest1,share=yes,prealloc=yes,\ -size=1073741824 \ -overcommit mem-lock=off \ -smp 2,sockets=2,dies=1,cores=1,threads=1 \ -object memory-backend-file,id=ram-node0,\ diff --git a/tests/qemuxml2argvdata/memfd-memory-default-hugepage.x86_64-latest.args b/tests/qemuxml2argvdata/memfd-memory-default-hugepage.x86_64-latest.args index b43e7d9c3c..ef15e2e97e 100644 --- a/tests/qemuxml2argvdata/memfd-memory-default-hugepage.x86_64-latest.args +++ b/tests/qemuxml2argvdata/memfd-memory-default-hugepage.x86_64-latest.args @@ -12,12 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-instance-00000092/master-key.aes \ --machine pc-i440fx-2.3,accel=kvm,usb=off,dump-guest-core=off,\ -memory-backend=pc.ram \ +-machine pc-i440fx-2.3,accel=kvm,usb=off,dump-guest-core=off \ -cpu qemu64 \ -m 14336 \ --object memory-backend-memfd,id=pc.ram,hugetlb=yes,hugetlbsize=2097152,\ -share=yes,prealloc=yes,size=15032385536 \ -overcommit mem-lock=off \ -smp 8,sockets=1,dies=1,cores=8,threads=1 \ -object memory-backend-memfd,id=ram-node0,hugetlb=yes,hugetlbsize=2097152,\ diff --git a/tests/qemuxml2argvdata/memfd-memory-numa.x86_64-latest.args b/tests/qemuxml2argvdata/memfd-memory-numa.x86_64-latest.args index b43e7d9c3c..ef15e2e97e 100644 --- a/tests/qemuxml2argvdata/memfd-memory-numa.x86_64-latest.args +++ b/tests/qemuxml2argvdata/memfd-memory-numa.x86_64-latest.args @@ -12,12 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-instance-00000092/master-key.aes \ --machine pc-i440fx-2.3,accel=kvm,usb=off,dump-guest-core=off,\ -memory-backend=pc.ram \ +-machine pc-i440fx-2.3,accel=kvm,usb=off,dump-guest-core=off \ -cpu qemu64 \ -m 14336 \ --object memory-backend-memfd,id=pc.ram,hugetlb=yes,hugetlbsize=2097152,\ -share=yes,prealloc=yes,size=15032385536 \ -overcommit mem-lock=off \ -smp 8,sockets=1,dies=1,cores=8,threads=1 \ -object memory-backend-memfd,id=ram-node0,hugetlb=yes,hugetlbsize=2097152,\ diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-access.x86_64-latest.args b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-access.x86_64-latest.args index c5c5befdd5..8d3fa2e867 100644 --- a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-access.x86_64-latest.args +++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-access.x86_64-latest.args @@ -12,11 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ --machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on,\ -memory-backend=pc.ram \ +-machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on \ -cpu qemu64 \ -m size=219136k,slots=16,maxmem=1099511627776k \ --object memory-backend-ram,id=pc.ram,size=224395264 \ -overcommit mem-lock=off \ -smp 2,sockets=2,dies=1,cores=1,threads=1 \ -object memory-backend-ram,id=ram-node0,size=224395264 \ diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.x86_64-latest.args b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.x86_64-latest.args index 418bf1158d..4f22f78277 100644 --- a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.x86_64-latest.args +++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.x86_64-latest.args @@ -12,11 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ --machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on,\ -memory-backend=pc.ram \ +-machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on \ -cpu qemu64 \ -m size=219136k,slots=16,maxmem=1099511627776k \ --object memory-backend-ram,id=pc.ram,size=224395264 \ -overcommit mem-lock=off \ -smp 2,sockets=2,dies=1,cores=1,threads=1 \ -object memory-backend-ram,id=ram-node0,size=224395264 \ diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-label.x86_64-latest.args b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-label.x86_64-latest.args index 66477a2b09..53dda234a2 100644 --- a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-label.x86_64-latest.args +++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-label.x86_64-latest.args @@ -12,11 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ --machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on,\ -memory-backend=pc.ram \ +-machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on \ -cpu qemu64 \ -m size=219136k,slots=16,maxmem=1099511627776k \ --object memory-backend-ram,id=pc.ram,size=224395264 \ -overcommit mem-lock=off \ -smp 2,sockets=2,dies=1,cores=1,threads=1 \ -object memory-backend-ram,id=ram-node0,size=224395264 \ diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-pmem.x86_64-latest.args b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-pmem.x86_64-latest.args index 759d749c2e..cac02a6f6d 100644 --- a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-pmem.x86_64-latest.args +++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-pmem.x86_64-latest.args @@ -12,11 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ --machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on,\ -memory-backend=pc.ram \ +-machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on \ -cpu qemu64 \ -m size=219136k,slots=16,maxmem=1099511627776k \ --object memory-backend-ram,id=pc.ram,size=224395264 \ -overcommit mem-lock=off \ -smp 2,sockets=2,dies=1,cores=1,threads=1 \ -object memory-backend-ram,id=ram-node0,size=224395264 \ diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-readonly.x86_64-latest.args b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-readonly.x86_64-latest.args index b195b8625c..5e44496e39 100644 --- a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-readonly.x86_64-latest.args +++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-readonly.x86_64-latest.args @@ -12,11 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ --machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on,\ -memory-backend=pc.ram \ +-machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on \ -cpu qemu64 \ -m size=219136k,slots=16,maxmem=1099511627776k \ --object memory-backend-ram,id=pc.ram,size=224395264 \ -overcommit mem-lock=off \ -smp 2,sockets=2,dies=1,cores=1,threads=1 \ -object memory-backend-ram,id=ram-node0,size=224395264 \ diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm.x86_64-latest.args b/tests/qemuxml2argvdata/memory-hotplug-nvdimm.x86_64-latest.args index ae416d7c7f..94f8444d95 100644 --- a/tests/qemuxml2argvdata/memory-hotplug-nvdimm.x86_64-latest.args +++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm.x86_64-latest.args @@ -12,11 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ --machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on,\ -memory-backend=pc.ram \ +-machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on \ -cpu qemu64 \ -m size=1048576k,slots=16,maxmem=1099511627776k \ --object memory-backend-ram,id=pc.ram,size=1073741824 \ -overcommit mem-lock=off \ -smp 2,sockets=2,dies=1,cores=1,threads=1 \ -object memory-backend-ram,id=ram-node0,size=1073741824 \ diff --git a/tests/qemuxml2argvdata/numatune-hmat.x86_64-latest.args b/tests/qemuxml2argvdata/numatune-hmat.x86_64-latest.args index be4a9ed871..c52015caa8 100644 --- a/tests/qemuxml2argvdata/numatune-hmat.x86_64-latest.args +++ b/tests/qemuxml2argvdata/numatune-hmat.x86_64-latest.args @@ -12,11 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-QEMUGuest/master-key.aes \ --machine pc,accel=tcg,usb=off,dump-guest-core=off,hmat=on,\ -memory-backend=pc.ram \ +-machine pc,accel=tcg,usb=off,dump-guest-core=off,hmat=on \ -cpu qemu64 \ -m 12288 \ --object memory-backend-ram,id=pc.ram,size=12884901888 \ -overcommit mem-lock=off \ -smp 12,sockets=12,cores=1,threads=1 \ -object memory-backend-ram,id=ram-node0,size=2147483648 \ diff --git a/tests/qemuxml2argvdata/vhost-user-fs-fd-memory.x86_64-latest.args b/tests/qemuxml2argvdata/vhost-user-fs-fd-memory.x86_64-latest.args index 13359c91fe..dd5f68abc5 100644 --- a/tests/qemuxml2argvdata/vhost-user-fs-fd-memory.x86_64-latest.args +++ b/tests/qemuxml2argvdata/vhost-user-fs-fd-memory.x86_64-latest.args @@ -12,11 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-guest/master-key.aes \ --machine pc,accel=kvm,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-machine pc,accel=kvm,usb=off,dump-guest-core=off \ -cpu qemu64 \ -m 14336 \ --object memory-backend-file,id=pc.ram,\ -mem-path=/var/lib/libvirt/qemu/ram/-1-guest/pc.ram,share=yes,size=15032385536 \ -overcommit mem-lock=off \ -smp 2,sockets=2,cores=1,threads=1 \ -object memory-backend-file,id=ram-node0,\ diff --git a/tests/qemuxml2argvdata/vhost-user-fs-hugepages.x86_64-latest.args b/tests/qemuxml2argvdata/vhost-user-fs-hugepages.x86_64-latest.args index 59f45d466b..e4f5db7a63 100644 --- a/tests/qemuxml2argvdata/vhost-user-fs-hugepages.x86_64-latest.args +++ b/tests/qemuxml2argvdata/vhost-user-fs-hugepages.x86_64-latest.args @@ -12,12 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-guest/master-key.aes \ --machine q35,accel=tcg,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-machine q35,accel=tcg,usb=off,dump-guest-core=off \ -cpu qemu64 \ -m 2048 \ --object memory-backend-file,id=pc.ram,\ -mem-path=/dev/hugepages2M/libvirt/qemu/-1-guest,share=yes,prealloc=yes,\ -size=2147483648 \ -overcommit mem-lock=off \ -smp 2,sockets=2,cores=1,threads=1 \ -object memory-backend-file,id=ram-node0,\ diff --git a/tests/qemuxml2argvdata/vhost-user-gpu-secondary.x86_64-latest.args b/tests/qemuxml2argvdata/vhost-user-gpu-secondary.x86_64-latest.args index e7d3315b8f..e99a5342dc 100644 --- a/tests/qemuxml2argvdata/vhost-user-gpu-secondary.x86_64-latest.args +++ b/tests/qemuxml2argvdata/vhost-user-gpu-secondary.x86_64-latest.args @@ -12,10 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ --machine pc,accel=tcg,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-machine pc,accel=tcg,usb=off,dump-guest-core=off \ -cpu qemu64 \ -m 214 \ --object memory-backend-memfd,id=pc.ram,share=yes,size=224395264 \ -overcommit mem-lock=off \ -smp 1,sockets=1,cores=1,threads=1 \ -object memory-backend-memfd,id=ram-node0,share=yes,size=224395264 \ diff --git a/tests/qemuxml2argvdata/vhost-user-vga.x86_64-latest.args b/tests/qemuxml2argvdata/vhost-user-vga.x86_64-latest.args index df5b1b481d..277bf8c646 100644 --- a/tests/qemuxml2argvdata/vhost-user-vga.x86_64-latest.args +++ b/tests/qemuxml2argvdata/vhost-user-vga.x86_64-latest.args @@ -12,10 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ --machine pc,accel=tcg,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-machine pc,accel=tcg,usb=off,dump-guest-core=off \ -cpu qemu64 \ -m 214 \ --object memory-backend-memfd,id=pc.ram,share=yes,size=224395264 \ -overcommit mem-lock=off \ -smp 1,sockets=1,cores=1,threads=1 \ -object memory-backend-memfd,id=ram-node0,share=yes,size=224395264 \ --
participants (3)
-
Masayoshi Mizuma
-
Michal Privoznik
-
Peter Krempa