Pablo Greco 40546a
From 607f70a5d24d2df9c63861434c4ba1991226ee34 Mon Sep 17 00:00:00 2001
Pablo Greco 40546a
Message-Id: <607f70a5d24d2df9c63861434c4ba1991226ee34@dist-git>
Pablo Greco 40546a
From: Andrea Bolognani <abologna@redhat.com>
Pablo Greco 40546a
Date: Tue, 11 Jun 2019 10:55:03 +0200
Pablo Greco 40546a
Subject: [PATCH] qemu: Fix qemuProcessInitCpuAffinity()
Pablo Greco 40546a
MIME-Version: 1.0
Pablo Greco 40546a
Content-Type: text/plain; charset=UTF-8
Pablo Greco 40546a
Content-Transfer-Encoding: 8bit
Pablo Greco 40546a
Pablo Greco 40546a
Ever since the feature was introduced with commit 0f8e7ae33ace,
Pablo Greco 40546a
it has contained a logic error in that it attempted to use a NUMA
Pablo Greco 40546a
node map where a CPU map was expected.
Pablo Greco 40546a
Pablo Greco 40546a
Because of that, guests using <numatune> might fail to start:
Pablo Greco 40546a
Pablo Greco 40546a
  # virsh start guest
Pablo Greco 40546a
  error: Failed to start domain guest
Pablo Greco 40546a
  error: cannot set CPU affinity on process 40055: Invalid argument
Pablo Greco 40546a
Pablo Greco 40546a
This was particularly easy to trigger on POWER 8 machines, where
Pablo Greco 40546a
secondary threads always show up as offline in the host: having
Pablo Greco 40546a
Pablo Greco 40546a
  <numatune>
Pablo Greco 40546a
    <memory mode='strict' placement='static' nodeset='1'/>
Pablo Greco 40546a
  </numatune>
Pablo Greco 40546a
Pablo Greco 40546a
in the guest configuration, for example, would result in libvirt
Pablo Greco 40546a
trying to set the process affinity so that it would prefer
Pablo Greco 40546a
running on CPU 1, but since that's a secondary thread and thus
Pablo Greco 40546a
shows up as offline, the operation would fail, and so would
Pablo Greco 40546a
starting the guest.
Pablo Greco 40546a
Pablo Greco 40546a
Use the newly introduced virNumaNodesetToCPUset() to convert the
Pablo Greco 40546a
NUMA node map to a CPU map, which in the example above would be
Pablo Greco 40546a
48,56,64,72,80,88 - a valid input for virProcessSetAffinity().
Pablo Greco 40546a
Pablo Greco 40546a
https://bugzilla.redhat.com/show_bug.cgi?id=1703661
Pablo Greco 40546a
Pablo Greco 40546a
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
Pablo Greco 40546a
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Pablo Greco 40546a
(cherry picked from commit 5f2212c062c720716b7701fa0a5511311dc6e906)
Pablo Greco 40546a
Pablo Greco 40546a
https://bugzilla.redhat.com/show_bug.cgi?id=1716908
Pablo Greco 40546a
Pablo Greco 40546a
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
Pablo Greco 40546a
Message-Id: <20190611085506.12564-4-abologna@redhat.com>
Pablo Greco 40546a
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Pablo Greco 40546a
---
Pablo Greco 40546a
 src/qemu/qemu_process.c | 7 ++++++-
Pablo Greco 40546a
 1 file changed, 6 insertions(+), 1 deletion(-)
Pablo Greco 40546a
Pablo Greco 40546a
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
Pablo Greco 40546a
index 8b05cef80c..a3b71354e1 100644
Pablo Greco 40546a
--- a/src/qemu/qemu_process.c
Pablo Greco 40546a
+++ b/src/qemu/qemu_process.c
Pablo Greco 40546a
@@ -2382,11 +2382,16 @@ qemuProcessInitCpuAffinity(virDomainObjPtr vm)
Pablo Greco 40546a
     if (virDomainNumaGetNodeCount(vm->def->numa) <= 1 &&
Pablo Greco 40546a
         virDomainNumatuneGetMode(vm->def->numa, -1, &mem_mode) == 0 &&
Pablo Greco 40546a
         mem_mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT) {
Pablo Greco 40546a
+        virBitmapPtr nodeset = NULL;
Pablo Greco 40546a
+
Pablo Greco 40546a
         if (virDomainNumatuneMaybeGetNodeset(vm->def->numa,
Pablo Greco 40546a
                                              priv->autoNodeset,
Pablo Greco 40546a
-                                             &cpumapToSet,
Pablo Greco 40546a
+                                             &nodeset,
Pablo Greco 40546a
                                              -1) < 0)
Pablo Greco 40546a
             goto cleanup;
Pablo Greco 40546a
+
Pablo Greco 40546a
+        if (virNumaNodesetToCPUset(nodeset, &cpumapToSet) < 0)
Pablo Greco 40546a
+            goto cleanup;
Pablo Greco 40546a
     } else if (vm->def->cputune.emulatorpin) {
Pablo Greco 40546a
         cpumapToSet = vm->def->cputune.emulatorpin;
Pablo Greco 40546a
     } else {
Pablo Greco 40546a
-- 
Pablo Greco 40546a
2.22.0
Pablo Greco 40546a