]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu_command: Generate -mem-prealloc in one corner case more
authorMichal Privoznik <mprivozn@redhat.com>
Wed, 15 Sep 2021 13:59:59 +0000 (15:59 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Mon, 22 Nov 2021 11:27:29 +0000 (12:27 +0100)
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>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_command.c
tests/qemuxml2argvdata/fd-memory-numa-topology.args
tests/qemuxml2argvdata/fd-memory-numa-topology2.args
tests/qemuxml2argvdata/fd-memory-numa-topology3.args
tests/qemuxml2argvdata/fd-memory-numa-topology4.x86_64-latest.args

index 3108bdd5813a8bafced33084a32e839480aed0a3..80adf5b716af973b3670090af4beff2c1731e782 100644 (file)
@@ -7371,6 +7371,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
@@ -7384,19 +7385,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;
 }
@@ -7462,11 +7466,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.
index f2e0941500c04eb3420414c2ebc135f911ff347c..48460f9bc37dbcbaa0eeb6bb33a96f8a721333e6 100644 (file)
@@ -13,10 +13,9 @@ QEMU_AUDIO_DRV=none \
 -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 \
 -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 \
index e04d8143020b56da88a3459c4d9e68fbc454cb58..e612c6bc542b4d089a4e084c5da71c3c794f7568 100644 (file)
@@ -13,12 +13,11 @@ QEMU_AUDIO_DRV=none \
 -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 \
 -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 \
index 497eabe58d3f2eda019aca21644a60985c06f451..63c8db8db79734d0e8ca4e1b4bbf03c3c2b64f07 100644 (file)
@@ -13,14 +13,13 @@ QEMU_AUDIO_DRV=none \
 -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 \
 -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 \
index 37197efd6e336f721d073507cb6cdd17b33224da..8e63cacb5a9293b549062a8136ada331335beb18 100644 (file)
@@ -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 \