We've been building up to this. This adds support for cputune/cachetune
settings for domains in the QEMU driver. The addition into
qemuProcessSetupVcpu() automatically adds support for hotplug. For hot-unplug
we need to remove the allocation only if all the vCPUs were unplugged. But
since the threads are left running, we can't really do much about it now.
Signed-off-by: Martin Kletzander <mkletzan(a)redhat.com>
---
src/qemu/qemu_process.c | 60 ++++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 55 insertions(+), 5 deletions(-)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 25ec464d3e1c..3a697de037e1 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -2507,6 +2507,32 @@ qemuProcessSetupEmulator(virDomainObjPtr vm)
}
+static int
+qemuProcessResctrlCreate(virQEMUDriverPtr driver,
+ virDomainObjPtr vm)
+{
+ int ret = -1;
+ size_t i = 0;
+ virCapsPtr caps = virQEMUDriverGetCapabilities(driver, false);
+ qemuDomainObjPrivatePtr priv = vm->privateData;
+
+ if (!caps)
+ return -1;
+
+ for (i = 0; i < vm->def->ncachetunes; i++) {
+ if (virResctrlAllocCreate(caps->host.resctrl,
+ vm->def->cachetunes[i]->alloc,
+ priv->machineName) < 0)
+ goto cleanup;
+ }
+
+ ret = 0;
+ cleanup:
+ virObjectUnref(caps);
+ return ret;
+}
+
+
static int
qemuProcessInitPasswords(virConnectPtr conn,
virQEMUDriverPtr driver,
@@ -5018,12 +5044,26 @@ qemuProcessSetupVcpu(virDomainObjPtr vm,
{
pid_t vcpupid = qemuDomainGetVcpuPid(vm, vcpuid);
virDomainVcpuDefPtr vcpu = virDomainDefGetVcpu(vm->def, vcpuid);
+ size_t i = 0;
- return qemuProcessSetupPid(vm, vcpupid, VIR_CGROUP_THREAD_VCPU,
- vcpuid, vcpu->cpumask,
- vm->def->cputune.period,
- vm->def->cputune.quota,
- &vcpu->sched);
+ if (qemuProcessSetupPid(vm, vcpupid, VIR_CGROUP_THREAD_VCPU,
+ vcpuid, vcpu->cpumask,
+ vm->def->cputune.period,
+ vm->def->cputune.quota,
+ &vcpu->sched) < 0)
+ return -1;
+
+ for (i = 0; i < vm->def->ncachetunes; i++) {
+ virDomainCachetuneDefPtr ct = vm->def->cachetunes[i];
+
+ if (virBitmapIsBitSet(ct->vcpus, vcpuid)) {
+ if (virResctrlAllocAddPID(ct->alloc, vcpupid) < 0)
+ return -1;
+ break;
+ }
+ }
+
+ return 0;
}
@@ -5896,6 +5936,10 @@ qemuProcessLaunch(virConnectPtr conn,
if (qemuProcessSetupEmulator(vm) < 0)
goto cleanup;
+ VIR_DEBUG("Setting up resctrlfs");
+ if (qemuProcessResctrlCreate(driver, vm) < 0)
+ goto cleanup;
+
VIR_DEBUG("Setting domain security labels");
if (qemuSecuritySetAllLabel(driver,
vm,
@@ -6544,6 +6588,12 @@ void qemuProcessStop(virQEMUDriverPtr driver,
vm->def->name);
}
+ /* Remove resctrl allocation after cgroups are cleaned up which makes it
+ * kind of safer (although removing the allocation should work even with
+ * pids in tasks file */
+ for (i = 0; i < vm->def->ncachetunes; i++)
+ virResctrlAllocRemove(vm->def->cachetunes[i]->alloc);
+
qemuProcessRemoveDomainStatus(driver, vm);
/* Remove VNC and Spice ports from port reservation bitmap, but only if
--
2.16.1