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(a)redhat.com>
Signed-off-by: Michal Privoznik <mprivozn(a)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