Blame SOURCES/libvirt-qemu-Set-up-EMULATOR-thread-and-cpuset.mems-before-exec-ing-qemu.patch

0a7476
From b733703cfcc4b4e8966051ba20bed301645331d0 Mon Sep 17 00:00:00 2001
0a7476
Message-Id: <b733703cfcc4b4e8966051ba20bed301645331d0@dist-git>
0a7476
From: Michal Privoznik <mprivozn@redhat.com>
0a7476
Date: Thu, 18 Apr 2019 18:58:58 +0200
0a7476
Subject: [PATCH] qemu: Set up EMULATOR thread and cpuset.mems before
0a7476
 exec()-ing qemu
0a7476
0a7476
https://bugzilla.redhat.com/show_bug.cgi?id=1695434
0a7476
0a7476
It's funny how this went unnoticed for such a long time. Long
0a7476
story short, if a domain is configured with
0a7476
VIR_DOMAIN_NUMATUNE_MEM_STRICT libvirt doesn't really honour
0a7476
that. This is because of 7e72ac787848 after which libvirt allowed
0a7476
qemu to allocate memory just anywhere and only after that it used
0a7476
some magic involving cpuset.memory_migrate and cpuset.mems to
0a7476
move the memory to desired NUMA nodes. This was done in order to
0a7476
work around some KVM bug where KVM would fail if there wasn't a
0a7476
DMA zone available on the NUMA node. Well, while the work around
0a7476
might stopped libvirt tickling the KVM bug it also caused a bug
0a7476
on libvirt side: if there is not enough memory on configured NUMA
0a7476
node(s) then any attempt to start a domain must fail. Because of
0a7476
the way we play with guest memory domains can start just happily.
0a7476
0a7476
The solution is to move the child we've just forked into emulator
0a7476
cgroup, set up cpuset.mems and exec() qemu only after that.
0a7476
0a7476
This basically reverts 7e72ac787848b7434c9 which was a workaround
0a7476
for kernel bug. This bug was apparently fixed because I've tested
0a7476
this successfully with recent kernel.
0a7476
0a7476
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
0a7476
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
0a7476
(cherry picked from commit 0eaa4716e1b8f6eb59d77049aed3735c3b5fbdd6)
0a7476
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
0a7476
Message-Id: <efd9d64c94a027281c244c05f69cc9f4c31ed83b.1555606711.git.mprivozn@redhat.com>
0a7476
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
0a7476
---
0a7476
 src/qemu/qemu_process.c | 8 ++++----
0a7476
 1 file changed, 4 insertions(+), 4 deletions(-)
0a7476
0a7476
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
0a7476
index 7d04a6e226..208c64381c 100644
0a7476
--- a/src/qemu/qemu_process.c
0a7476
+++ b/src/qemu/qemu_process.c
0a7476
@@ -6432,6 +6432,10 @@ qemuProcessLaunch(virConnectPtr conn,
0a7476
     if (qemuProcessInitCpuAffinity(vm) < 0)
0a7476
         goto cleanup;
0a7476
 
0a7476
+    VIR_DEBUG("Setting emulator tuning/settings");
0a7476
+    if (qemuProcessSetupEmulator(vm) < 0)
0a7476
+        goto cleanup;
0a7476
+
0a7476
     VIR_DEBUG("Setting cgroup for external devices (if required)");
0a7476
     if (qemuSetupCgroupForExtDevices(vm, driver) < 0)
0a7476
         goto cleanup;
0a7476
@@ -6523,10 +6527,6 @@ qemuProcessLaunch(virConnectPtr conn,
0a7476
     if (qemuProcessDetectIOThreadPIDs(driver, vm, asyncJob) < 0)
0a7476
         goto cleanup;
0a7476
 
0a7476
-    VIR_DEBUG("Setting emulator tuning/settings");
0a7476
-    if (qemuProcessSetupEmulator(vm) < 0)
0a7476
-        goto cleanup;
0a7476
-
0a7476
     VIR_DEBUG("Setting global CPU cgroup (if required)");
0a7476
     if (qemuSetupGlobalCpuCgroup(vm) < 0)
0a7476
         goto cleanup;
0a7476
-- 
0a7476
2.21.0
0a7476