]> xenbits.xensource.com Git - libvirt.git/commitdiff
Implement qemuSetupGlobalCpuCgroup
authorAlexander Burluka <aburluka@virtuozzo.com>
Tue, 16 Feb 2016 13:43:37 +0000 (16:43 +0300)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 1 Mar 2016 14:30:11 +0000 (14:30 +0000)
This functions setups per-domain cpu bandwidth parameters

Signed-off-by: Alexander Burluka <aburluka@virtuozzo.com>
src/qemu/qemu_cgroup.c
src/qemu/qemu_cgroup.h
src/qemu/qemu_process.c

index a294bb079fbf515883438a3b8ad76cec0ee72415..c76d5857f715b6e77034f01746f47e9cfbd7e9ed 100644 (file)
@@ -1061,6 +1061,55 @@ qemuSetupCgroupCpusetCpus(virCgroupPtr cgroup,
 }
 
 
+int
+qemuSetupGlobalCpuCgroup(virDomainObjPtr vm)
+{
+    qemuDomainObjPrivatePtr priv = vm->privateData;
+    unsigned long long period = vm->def->cputune.global_period;
+    long long quota = vm->def->cputune.global_quota;
+    char *mem_mask = NULL;
+    virDomainNumatuneMemMode mem_mode;
+
+    if ((period || quota) &&
+        !virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPU)) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("cgroup cpu is required for scheduler tuning"));
+        return -1;
+    }
+
+    /*
+     * If CPU cgroup controller is not initialized here, then we need
+     * neither period nor quota settings.  And if CPUSET controller is
+     * not initialized either, then there's nothing to do anyway.
+     */
+    if (!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPU) &&
+        !virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET))
+        return 0;
+
+
+    if (virDomainNumatuneGetMode(vm->def->numa, -1, &mem_mode) == 0 &&
+        mem_mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT &&
+        virDomainNumatuneMaybeFormatNodeset(vm->def->numa,
+                                            priv->autoNodeset,
+                                            &mem_mask, -1) < 0)
+        goto cleanup;
+
+    if (period || quota) {
+        if (qemuSetupCgroupVcpuBW(priv->cgroup, period, quota) < 0)
+            goto cleanup;
+    }
+
+    VIR_FREE(mem_mask);
+
+    return 0;
+
+ cleanup:
+    VIR_FREE(mem_mask);
+
+    return -1;
+}
+
+
 int
 qemuRemoveCgroup(virDomainObjPtr vm)
 {
index 7a9d10a5f45f2679cfa9e99802977e711e20c3bb..dc340a1314589cdf63c4789df444bfb23e311e1e 100644 (file)
@@ -54,6 +54,7 @@ int qemuSetupCgroupVcpuBW(virCgroupPtr cgroup,
                           unsigned long long period,
                           long long quota);
 int qemuSetupCgroupCpusetCpus(virCgroupPtr cgroup, virBitmapPtr cpumask);
+int qemuSetupGlobalCpuCgroup(virDomainObjPtr vm);
 int qemuRemoveCgroup(virDomainObjPtr vm);
 
 #endif /* __QEMU_CGROUP_H__ */
index 13813131f2d28d3b9fe6a628b461f5ae7ef53f75..dcc1fe6fbf962e637fad829c14876bdb564cd4fe 100644 (file)
@@ -5232,6 +5232,10 @@ qemuProcessLaunch(virConnectPtr conn,
     if (qemuProcessDetectIOThreadPIDs(driver, vm, asyncJob) < 0)
         goto cleanup;
 
+    VIR_DEBUG("Setting global CPU cgroup (if required)");
+    if (qemuSetupGlobalCpuCgroup(vm) < 0)
+        goto cleanup;
+
     VIR_DEBUG("Setting vCPU tuning/settings");
     if (qemuProcessSetupVcpus(vm) < 0)
         goto cleanup;