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