]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: process: Move emulator thread setting code into one function
authorPeter Krempa <pkrempa@redhat.com>
Wed, 24 Feb 2016 13:45:44 +0000 (14:45 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 1 Mar 2016 14:07:27 +0000 (14:07 +0000)
Similarly to the refactors to iothreads and vcpus, move the code that
initializes the emulator thread settings into single function.

src/qemu/qemu_cgroup.c
src/qemu/qemu_cgroup.h
src/qemu/qemu_process.c

index f3c5fbb14e3718c92de7711fd6f4f0d164b9d747..a294bb079fbf515883438a3b8ad76cec0ee72415 100644 (file)
@@ -1061,72 +1061,6 @@ qemuSetupCgroupCpusetCpus(virCgroupPtr cgroup,
 }
 
 
-int
-qemuSetupCgroupForEmulator(virDomainObjPtr vm)
-{
-    virBitmapPtr cpumask = NULL;
-    virCgroupPtr cgroup_emulator = NULL;
-    virDomainDefPtr def = vm->def;
-    qemuDomainObjPrivatePtr priv = vm->privateData;
-    unsigned long long period = vm->def->cputune.emulator_period;
-    long long quota = vm->def->cputune.emulator_quota;
-
-    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 (virCgroupNewThread(priv->cgroup, VIR_CGROUP_THREAD_EMULATOR, 0,
-                           true, &cgroup_emulator) < 0)
-        goto cleanup;
-
-    if (virCgroupMoveTask(priv->cgroup, cgroup_emulator) < 0)
-        goto cleanup;
-
-    if (def->cputune.emulatorpin)
-        cpumask = def->cputune.emulatorpin;
-    else if (def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO)
-        cpumask = priv->autoCpuset;
-    else if (def->cpumask)
-        cpumask = def->cpumask;
-
-    if (cpumask) {
-        if (virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET) &&
-            qemuSetupCgroupCpusetCpus(cgroup_emulator, cpumask) < 0)
-            goto cleanup;
-    }
-
-    if (period || quota) {
-        if (virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPU) &&
-            qemuSetupCgroupVcpuBW(cgroup_emulator, period,
-                                  quota) < 0)
-            goto cleanup;
-    }
-
-    virCgroupFree(&cgroup_emulator);
-    return 0;
-
- cleanup:
-    if (cgroup_emulator) {
-        virCgroupRemove(cgroup_emulator);
-        virCgroupFree(&cgroup_emulator);
-    }
-
-    return -1;
-}
-
-
 int
 qemuRemoveCgroup(virDomainObjPtr vm)
 {
index a8b8e1b8b5866136aa804ef9e037c0c6c3bf1870..7a9d10a5f45f2679cfa9e99802977e711e20c3bb 100644 (file)
@@ -54,7 +54,6 @@ int qemuSetupCgroupVcpuBW(virCgroupPtr cgroup,
                           unsigned long long period,
                           long long quota);
 int qemuSetupCgroupCpusetCpus(virCgroupPtr cgroup, virBitmapPtr cpumask);
-int qemuSetupCgroupForEmulator(virDomainObjPtr vm);
 int qemuRemoveCgroup(virDomainObjPtr vm);
 
 #endif /* __QEMU_CGROUP_H__ */
index ded20b157c588265d8e27853766c035c1b53c8c5..2fd384f0d58fb49f6f3b6f855a27ca04e3878235 100644 (file)
@@ -2185,22 +2185,72 @@ qemuProcessSetLinkStates(virQEMUDriverPtr driver,
 }
 
 
-/* Set CPU affinities for emulator threads. */
 static int
-qemuProcessSetEmulatorAffinity(virDomainObjPtr vm)
+qemuProcessSetupEmulator(virDomainObjPtr vm)
 {
-    virBitmapPtr cpumask;
-    virDomainDefPtr def = vm->def;
+    virBitmapPtr cpumask = NULL;
+    virCgroupPtr cgroup_emulator = NULL;
+    qemuDomainObjPrivatePtr priv = vm->privateData;
+    unsigned long long period = vm->def->cputune.emulator_period;
+    long long quota = vm->def->cputune.emulator_quota;
     int ret = -1;
 
-    if (def->cputune.emulatorpin)
-        cpumask = def->cputune.emulatorpin;
-    else if (def->cpumask)
-        cpumask = def->cpumask;
+    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 (vm->def->cputune.emulatorpin)
+        cpumask = vm->def->cputune.emulatorpin;
+    else if (vm->def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO &&
+             priv->autoCpuset)
+        cpumask = priv->autoCpuset;
     else
-        return 0;
+        cpumask = vm->def->cpumask;
+
+    /* 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)) {
+
+        if (virCgroupNewThread(priv->cgroup, VIR_CGROUP_THREAD_EMULATOR, 0,
+                               true, &cgroup_emulator) < 0)
+            goto cleanup;
+
+        if (virCgroupMoveTask(priv->cgroup, cgroup_emulator) < 0)
+            goto cleanup;
+
+
+        if (cpumask) {
+            if (virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET) &&
+                qemuSetupCgroupCpusetCpus(cgroup_emulator, cpumask) < 0)
+                goto cleanup;
+        }
+
+        if (period || quota) {
+            if (virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPU) &&
+                qemuSetupCgroupVcpuBW(cgroup_emulator, period,
+                                      quota) < 0)
+                goto cleanup;
+        }
+    }
+
+    if (cpumask &&
+        virProcessSetAffinity(vm->pid, cpumask) < 0)
+        goto cleanup;
+
+    ret = 0;
+
+ cleanup:
+    if (cgroup_emulator) {
+        if (ret < 0)
+            virCgroupRemove(cgroup_emulator);
+        virCgroupFree(&cgroup_emulator);
+    }
 
-    ret = virProcessSetAffinity(vm->pid, cpumask);
     return ret;
 }
 
@@ -5147,12 +5197,8 @@ qemuProcessLaunch(virConnectPtr conn,
     if (rv == -1) /* The VM failed to start */
         goto cleanup;
 
-    VIR_DEBUG("Setting cgroup for emulator (if required)");
-    if (qemuSetupCgroupForEmulator(vm) < 0)
-        goto cleanup;
-
-    VIR_DEBUG("Setting affinity of emulator threads");
-    if (qemuProcessSetEmulatorAffinity(vm) < 0)
+    VIR_DEBUG("Setting emulator tuning/settings");
+    if (qemuProcessSetupEmulator(vm) < 0)
         goto cleanup;
 
     VIR_DEBUG("Waiting for monitor to show up");