[PATCH 0/2] qemu_command: Generate -mem-prealloc in one corner case more

This is a result of mu discussion with Jing: https://listman.redhat.com/archives/libvir-list/2021-September/msg00407.html Turns out, the problem has nothing to do with my virtio-mem patches so I'm sending fix separately. Michal Prívozník (2): qemuxml2argvtest: Introduce another numa-topology test qemu_command: Generate -mem-prealloc in one corner case more src/qemu/qemu_command.c | 17 ++++----- .../fd-memory-numa-topology.args | 3 +- .../fd-memory-numa-topology2.args | 5 +-- .../fd-memory-numa-topology3.args | 7 ++-- ...d-memory-numa-topology4.x86_64-latest.args | 34 +++++++++++++++++ .../fd-memory-numa-topology4.xml | 37 +++++++++++++++++++ tests/qemuxml2argvtest.c | 1 + ...fd-memory-numa-topology4.x86_64-latest.xml | 1 + tests/qemuxml2xmltest.c | 1 + 9 files changed, 88 insertions(+), 18 deletions(-) create mode 100644 tests/qemuxml2argvdata/fd-memory-numa-topology4.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/fd-memory-numa-topology4.xml create mode 120000 tests/qemuxml2xmloutdata/fd-memory-numa-topology4.x86_64-latest.xml -- 2.32.0

This test shows a bug we have: even though the XML says: <allocation mode='immediate'/> there is no -mem-prealloc nor .prealloc=yes anywhere on the cmd line. This will be fixed in the next commit. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- ...d-memory-numa-topology4.x86_64-latest.args | 33 +++++++++++++++++ .../fd-memory-numa-topology4.xml | 37 +++++++++++++++++++ tests/qemuxml2argvtest.c | 1 + ...fd-memory-numa-topology4.x86_64-latest.xml | 1 + tests/qemuxml2xmltest.c | 1 + 5 files changed, 73 insertions(+) create mode 100644 tests/qemuxml2argvdata/fd-memory-numa-topology4.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/fd-memory-numa-topology4.xml create mode 120000 tests/qemuxml2xmloutdata/fd-memory-numa-topology4.x86_64-latest.xml diff --git a/tests/qemuxml2argvdata/fd-memory-numa-topology4.x86_64-latest.args b/tests/qemuxml2argvdata/fd-memory-numa-topology4.x86_64-latest.args new file mode 100644 index 0000000000..203754373d --- /dev/null +++ b/tests/qemuxml2argvdata/fd-memory-numa-topology4.x86_64-latest.args @@ -0,0 +1,33 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-pc \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-pc/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-pc/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-pc/.config \ +/usr/bin/qemu-system-x86_64 \ +-name guest=pc,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-pc/master-key.aes"}' \ +-machine pc-i440fx-5.0,accel=kvm,usb=off,dump-guest-core=off \ +-cpu qemu64 \ +-m 1024 \ +-overcommit mem-lock=off \ +-smp 2,sockets=2,cores=1,threads=1 \ +-numa node,nodeid=0,cpus=0-1,mem=1024 \ +-uuid bb508b28-d57b-44bd-9e9c-a134cef24b60 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-audiodev id=audio1,driver=none \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/fd-memory-numa-topology4.xml b/tests/qemuxml2argvdata/fd-memory-numa-topology4.xml new file mode 100644 index 0000000000..2f5bd3e839 --- /dev/null +++ b/tests/qemuxml2argvdata/fd-memory-numa-topology4.xml @@ -0,0 +1,37 @@ +<domain type='kvm'> + <name>pc</name> + <uuid>bb508b28-d57b-44bd-9e9c-a134cef24b60</uuid> + <memory unit='KiB'>1179648</memory> + <currentMemory unit='KiB'>1179648</currentMemory> + <memoryBacking> + <allocation mode='immediate'/> + </memoryBacking> + <vcpu placement='static'>2</vcpu> + <os> + <type arch='x86_64' machine='pc-i440fx-5.0'>hvm</type> + <boot dev='hd'/> + </os> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>qemu64</model> + <numa> + <cell id='0' cpus='0-1' memory='1048576' unit='KiB' discard='yes'/> + </numa> + </cpu> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <controller type='usb' index='0' model='piix3-uhci'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <audio id='1' type='none'/> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 74af93b08f..46e176b0ec 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -3383,6 +3383,7 @@ mymain(void) QEMU_CAPS_KVM); DO_TEST("fd-memory-numa-topology3", QEMU_CAPS_OBJECT_MEMORY_FILE, QEMU_CAPS_KVM); + DO_TEST_CAPS_LATEST("fd-memory-numa-topology4"); DO_TEST("fd-memory-no-numa-topology", QEMU_CAPS_OBJECT_MEMORY_FILE, QEMU_CAPS_KVM); diff --git a/tests/qemuxml2xmloutdata/fd-memory-numa-topology4.x86_64-latest.xml b/tests/qemuxml2xmloutdata/fd-memory-numa-topology4.x86_64-latest.xml new file mode 120000 index 0000000000..68c72e72ed --- /dev/null +++ b/tests/qemuxml2xmloutdata/fd-memory-numa-topology4.x86_64-latest.xml @@ -0,0 +1 @@ +../qemuxml2argvdata/fd-memory-numa-topology4.xml \ No newline at end of file diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 6d3526f91f..8fa73dc9ac 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -1253,6 +1253,7 @@ mymain(void) QEMU_CAPS_KVM); DO_TEST("fd-memory-numa-topology3", QEMU_CAPS_OBJECT_MEMORY_FILE, QEMU_CAPS_KVM); + DO_TEST_CAPS_LATEST("fd-memory-numa-topology4"); DO_TEST("fd-memory-no-numa-topology", QEMU_CAPS_OBJECT_MEMORY_FILE, QEMU_CAPS_KVM); -- 2.32.0

When guest has NUMA nodes and QEMU is new enough to report default RAM ID then ideally we would use -numa memdev= combined with memory-backend-* combo becasue -mem-path/-mem-prealloc/-numa mem are deprecated. Well, there is one problem - the .memdev= attribute is machine type dependent (just look at arguments of virQEMUCapsGetMachineNumaMemSupported()) and to ensure backwards compatibility we prefer -numa mem= over -numa memdev=. But there was one corner case when -mem-prealloc was requested but not generated on the cmd line. It all starts with qemuBuildMemCommandLine() which generates just '-m XXX' and because it sees defaultRAMid and guest NUMA nodes greater than zero it does nothing more. Then, qemuBuildNumaCommandLine() sees that -numa mem= is still supported for given machine type and nothing else set @needBackend thus qemuBuildMemPathStr() is called which output -mem-prealloc only in a few cases assuming it was outputted earlier. Reported-by: Jing Qi <jinqi@redhat.com> Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/qemu/qemu_command.c | 17 ++++++++--------- .../fd-memory-numa-topology.args | 3 +-- .../fd-memory-numa-topology2.args | 5 ++--- .../fd-memory-numa-topology3.args | 7 +++---- .../fd-memory-numa-topology4.x86_64-latest.args | 1 + 5 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 73868ab4b7..e31eef3163 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7130,6 +7130,7 @@ qemuBuildMemPathStr(const virDomainDef *def, g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(priv->driver); const long system_page_size = virGetSystemPageSizeKB(); g_autofree char *mem_path = NULL; + bool prealloc = false; /* There are two cases where we want to put -mem-path onto * the command line: First one is when there are no guest @@ -7143,19 +7144,22 @@ qemuBuildMemPathStr(const virDomainDef *def, return -1; if (qemuGetDomainHupageMemPath(priv->driver, def, pagesize, &mem_path) < 0) return -1; + prealloc = true; } else if (def->mem.source == VIR_DOMAIN_MEMORY_SOURCE_FILE) { if (qemuGetMemoryBackingPath(priv->driver, def, "ram", &mem_path) < 0) return -1; - } else { - return 0; } - if (def->mem.allocation != VIR_DOMAIN_MEMORY_ALLOCATION_IMMEDIATE) { + if (def->mem.allocation == VIR_DOMAIN_MEMORY_ALLOCATION_IMMEDIATE) + prealloc = true; + + if (prealloc && !priv->memPrealloc) { virCommandAddArgList(cmd, "-mem-prealloc", NULL); priv->memPrealloc = true; } - virCommandAddArgList(cmd, "-mem-path", mem_path, NULL); + if (mem_path) + virCommandAddArgList(cmd, "-mem-path", mem_path, NULL); return 0; } @@ -7224,11 +7228,6 @@ qemuBuildMemCommandLine(virCommand *cmd, if (!virDomainNumaGetNodeCount(def->numa)) qemuBuildMemCommandLineMemoryDefaultBackend(cmd, def, priv, defaultRAMid); } else { - if (def->mem.allocation == VIR_DOMAIN_MEMORY_ALLOCATION_IMMEDIATE) { - virCommandAddArgList(cmd, "-mem-prealloc", NULL); - priv->memPrealloc = true; - } - /* * Add '-mem-path' (and '-mem-prealloc') parameter here if * the hugepages and no numa node is specified. diff --git a/tests/qemuxml2argvdata/fd-memory-numa-topology.args b/tests/qemuxml2argvdata/fd-memory-numa-topology.args index c8c1b0a613..be0539cbe4 100644 --- a/tests/qemuxml2argvdata/fd-memory-numa-topology.args +++ b/tests/qemuxml2argvdata/fd-memory-numa-topology.args @@ -12,10 +12,9 @@ QEMU_AUDIO_DRV=none \ -S \ -machine pc-i440fx-2.3,accel=kvm,usb=off,dump-guest-core=off \ -m 14336 \ --mem-prealloc \ -realtime mlock=off \ -smp 8,sockets=1,cores=8,threads=1 \ --object memory-backend-file,id=ram-node0,mem-path=/var/lib/libvirt/qemu/ram/-1-instance-00000092/ram-node0,share=on,size=15032385536 \ +-object memory-backend-file,id=ram-node0,mem-path=/var/lib/libvirt/qemu/ram/-1-instance-00000092/ram-node0,share=on,prealloc=on,size=15032385536 \ -numa node,nodeid=0,cpus=0-7,memdev=ram-node0 \ -uuid 126f2720-6f8e-45ab-a886-ec9277079a67 \ -display none \ diff --git a/tests/qemuxml2argvdata/fd-memory-numa-topology2.args b/tests/qemuxml2argvdata/fd-memory-numa-topology2.args index c07a6b1244..9271bb072e 100644 --- a/tests/qemuxml2argvdata/fd-memory-numa-topology2.args +++ b/tests/qemuxml2argvdata/fd-memory-numa-topology2.args @@ -12,12 +12,11 @@ QEMU_AUDIO_DRV=none \ -S \ -machine pc-i440fx-2.3,accel=kvm,usb=off,dump-guest-core=off \ -m 28672 \ --mem-prealloc \ -realtime mlock=off \ -smp 20,sockets=1,cores=8,threads=1 \ --object memory-backend-file,id=ram-node0,mem-path=/var/lib/libvirt/qemu/ram/-1-instance-00000092/ram-node0,share=off,size=15032385536 \ +-object memory-backend-file,id=ram-node0,mem-path=/var/lib/libvirt/qemu/ram/-1-instance-00000092/ram-node0,share=off,prealloc=on,size=15032385536 \ -numa node,nodeid=0,cpus=0-7,memdev=ram-node0 \ --object memory-backend-file,id=ram-node1,mem-path=/var/lib/libvirt/qemu/ram/-1-instance-00000092/ram-node1,share=on,size=15032385536 \ +-object memory-backend-file,id=ram-node1,mem-path=/var/lib/libvirt/qemu/ram/-1-instance-00000092/ram-node1,share=on,prealloc=on,size=15032385536 \ -numa node,nodeid=1,cpus=8-15,memdev=ram-node1 \ -uuid 126f2720-6f8e-45ab-a886-ec9277079a67 \ -display none \ diff --git a/tests/qemuxml2argvdata/fd-memory-numa-topology3.args b/tests/qemuxml2argvdata/fd-memory-numa-topology3.args index 5b2e8af09b..951fddf868 100644 --- a/tests/qemuxml2argvdata/fd-memory-numa-topology3.args +++ b/tests/qemuxml2argvdata/fd-memory-numa-topology3.args @@ -12,14 +12,13 @@ QEMU_AUDIO_DRV=none \ -S \ -machine pc-i440fx-2.3,accel=kvm,usb=off,dump-guest-core=off \ -m 43008 \ --mem-prealloc \ -realtime mlock=off \ -smp 32,sockets=1,cores=24,threads=1 \ --object memory-backend-file,id=ram-node0,mem-path=/var/lib/libvirt/qemu/ram/-1-instance-00000092/ram-node0,share=on,size=15032385536 \ +-object memory-backend-file,id=ram-node0,mem-path=/var/lib/libvirt/qemu/ram/-1-instance-00000092/ram-node0,share=on,prealloc=on,size=15032385536 \ -numa node,nodeid=0,cpus=0-1,memdev=ram-node0 \ --object memory-backend-file,id=ram-node1,mem-path=/var/lib/libvirt/qemu/ram/-1-instance-00000092/ram-node1,share=on,size=15032385536 \ +-object memory-backend-file,id=ram-node1,mem-path=/var/lib/libvirt/qemu/ram/-1-instance-00000092/ram-node1,share=on,prealloc=on,size=15032385536 \ -numa node,nodeid=1,cpus=2-3,memdev=ram-node1 \ --object memory-backend-file,id=ram-node2,mem-path=/var/lib/libvirt/qemu/ram/-1-instance-00000092/ram-node2,share=off,size=15032385536 \ +-object memory-backend-file,id=ram-node2,mem-path=/var/lib/libvirt/qemu/ram/-1-instance-00000092/ram-node2,share=off,prealloc=on,size=15032385536 \ -numa node,nodeid=2,cpus=4-5,memdev=ram-node2 \ -uuid 126f2720-6f8e-45ab-a886-ec9277079a67 \ -display none \ diff --git a/tests/qemuxml2argvdata/fd-memory-numa-topology4.x86_64-latest.args b/tests/qemuxml2argvdata/fd-memory-numa-topology4.x86_64-latest.args index 203754373d..9f15f28672 100644 --- a/tests/qemuxml2argvdata/fd-memory-numa-topology4.x86_64-latest.args +++ b/tests/qemuxml2argvdata/fd-memory-numa-topology4.x86_64-latest.args @@ -15,6 +15,7 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-pc/.config \ -m 1024 \ -overcommit mem-lock=off \ -smp 2,sockets=2,cores=1,threads=1 \ +-mem-prealloc \ -numa node,nodeid=0,cpus=0-1,mem=1024 \ -uuid bb508b28-d57b-44bd-9e9c-a134cef24b60 \ -display none \ -- 2.32.0

On a Thursday in 2021, Michal Privoznik wrote:
This is a result of mu discussion with Jing:
https://listman.redhat.com/archives/libvir-list/2021-September/msg00407.html
Turns out, the problem has nothing to do with my virtio-mem patches so I'm sending fix separately.
Michal Prívozník (2): qemuxml2argvtest: Introduce another numa-topology test qemu_command: Generate -mem-prealloc in one corner case more
src/qemu/qemu_command.c | 17 ++++----- .../fd-memory-numa-topology.args | 3 +- .../fd-memory-numa-topology2.args | 5 +-- .../fd-memory-numa-topology3.args | 7 ++-- ...d-memory-numa-topology4.x86_64-latest.args | 34 +++++++++++++++++ .../fd-memory-numa-topology4.xml | 37 +++++++++++++++++++ tests/qemuxml2argvtest.c | 1 + ...fd-memory-numa-topology4.x86_64-latest.xml | 1 + tests/qemuxml2xmltest.c | 1 + 9 files changed, 88 insertions(+), 18 deletions(-) create mode 100644 tests/qemuxml2argvdata/fd-memory-numa-topology4.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/fd-memory-numa-topology4.xml create mode 120000 tests/qemuxml2xmloutdata/fd-memory-numa-topology4.x86_64-latest.xml
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano
participants (2)
-
Ján Tomko
-
Michal Privoznik