c1c534
From 72285626fa7b899ceb9c8d4358b4b1b3fa7081a4 Mon Sep 17 00:00:00 2001
c1c534
Message-Id: <72285626fa7b899ceb9c8d4358b4b1b3fa7081a4@dist-git>
c1c534
From: Martin Kletzander <mkletzan@redhat.com>
c1c534
Date: Wed, 31 Jan 2018 16:32:32 +0100
c1c534
Subject: [PATCH] qemu: Add support for resctrl
c1c534
c1c534
We've been building up to this.  This adds support for cputune/cachetune
c1c534
settings for domains in the QEMU driver.  The addition into
c1c534
qemuProcessSetupVcpu() automatically adds support for hotplug.  For hot-unplug
c1c534
we need to remove the allocation only if all the vCPUs were unplugged.  But
c1c534
since the threads are left running, we can't really do much about it now.
c1c534
c1c534
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1289368
c1c534
c1c534
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
c1c534
(cherry picked from commit 9a2fc2db8fe18da41c274d52b6e52316a4bbe52d)
c1c534
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
c1c534
c1c534
https://bugzilla.redhat.com/show_bug.cgi?id=1289368
c1c534
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
c1c534
---
c1c534
 src/qemu/qemu_process.c | 60 ++++++++++++++++++++++++++++++++++++++++++++-----
c1c534
 1 file changed, 55 insertions(+), 5 deletions(-)
c1c534
c1c534
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
c1c534
index c64088e4ca..57faf9cd79 100644
c1c534
--- a/src/qemu/qemu_process.c
c1c534
+++ b/src/qemu/qemu_process.c
c1c534
@@ -2504,6 +2504,32 @@ qemuProcessSetupEmulator(virDomainObjPtr vm)
c1c534
 }
c1c534
 
c1c534
 
c1c534
+static int
c1c534
+qemuProcessResctrlCreate(virQEMUDriverPtr driver,
c1c534
+                         virDomainObjPtr vm)
c1c534
+{
c1c534
+    int ret = -1;
c1c534
+    size_t i = 0;
c1c534
+    virCapsPtr caps = virQEMUDriverGetCapabilities(driver, false);
c1c534
+    qemuDomainObjPrivatePtr priv = vm->privateData;
c1c534
+
c1c534
+    if (!caps)
c1c534
+        return -1;
c1c534
+
c1c534
+    for (i = 0; i < vm->def->ncachetunes; i++) {
c1c534
+        if (virResctrlAllocCreate(caps->host.resctrl,
c1c534
+                                  vm->def->cachetunes[i]->alloc,
c1c534
+                                  priv->machineName) < 0)
c1c534
+            goto cleanup;
c1c534
+    }
c1c534
+
c1c534
+    ret = 0;
c1c534
+ cleanup:
c1c534
+    virObjectUnref(caps);
c1c534
+    return ret;
c1c534
+}
c1c534
+
c1c534
+
c1c534
 static int
c1c534
 qemuProcessInitPasswords(virConnectPtr conn,
c1c534
                          virQEMUDriverPtr driver,
c1c534
@@ -5015,12 +5041,26 @@ qemuProcessSetupVcpu(virDomainObjPtr vm,
c1c534
 {
c1c534
     pid_t vcpupid = qemuDomainGetVcpuPid(vm, vcpuid);
c1c534
     virDomainVcpuDefPtr vcpu = virDomainDefGetVcpu(vm->def, vcpuid);
c1c534
+    size_t i = 0;
c1c534
 
c1c534
-    return qemuProcessSetupPid(vm, vcpupid, VIR_CGROUP_THREAD_VCPU,
c1c534
-                               vcpuid, vcpu->cpumask,
c1c534
-                               vm->def->cputune.period,
c1c534
-                               vm->def->cputune.quota,
c1c534
-                               &vcpu->sched);
c1c534
+    if (qemuProcessSetupPid(vm, vcpupid, VIR_CGROUP_THREAD_VCPU,
c1c534
+                            vcpuid, vcpu->cpumask,
c1c534
+                            vm->def->cputune.period,
c1c534
+                            vm->def->cputune.quota,
c1c534
+                            &vcpu->sched) < 0)
c1c534
+        return -1;
c1c534
+
c1c534
+    for (i = 0; i < vm->def->ncachetunes; i++) {
c1c534
+        virDomainCachetuneDefPtr ct = vm->def->cachetunes[i];
c1c534
+
c1c534
+        if (virBitmapIsBitSet(ct->vcpus, vcpuid)) {
c1c534
+            if (virResctrlAllocAddPID(ct->alloc, vcpupid) < 0)
c1c534
+                return -1;
c1c534
+            break;
c1c534
+        }
c1c534
+    }
c1c534
+
c1c534
+    return 0;
c1c534
 }
c1c534
 
c1c534
 
c1c534
@@ -5892,6 +5932,10 @@ qemuProcessLaunch(virConnectPtr conn,
c1c534
     if (qemuProcessSetupEmulator(vm) < 0)
c1c534
         goto cleanup;
c1c534
 
c1c534
+    VIR_DEBUG("Setting up resctrlfs");
c1c534
+    if (qemuProcessResctrlCreate(driver, vm) < 0)
c1c534
+        goto cleanup;
c1c534
+
c1c534
     VIR_DEBUG("Setting domain security labels");
c1c534
     if (qemuSecuritySetAllLabel(driver,
c1c534
                                 vm,
c1c534
@@ -6540,6 +6584,12 @@ void qemuProcessStop(virQEMUDriverPtr driver,
c1c534
                  vm->def->name);
c1c534
     }
c1c534
 
c1c534
+    /* Remove resctrl allocation after cgroups are cleaned up which makes it
c1c534
+     * kind of safer (although removing the allocation should work even with
c1c534
+     * pids in tasks file */
c1c534
+    for (i = 0; i < vm->def->ncachetunes; i++)
c1c534
+        virResctrlAllocRemove(vm->def->cachetunes[i]->alloc);
c1c534
+
c1c534
     qemuProcessRemoveDomainStatus(driver, vm);
c1c534
 
c1c534
     /* Remove VNC and Spice ports from port reservation bitmap, but only if
c1c534
-- 
c1c534
2.16.1
c1c534