]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: synchronize emulatorpin info to cgroup
authorTang Chen <tangchen@cn.fujitsu.com>
Tue, 21 Aug 2012 09:18:33 +0000 (17:18 +0800)
committerDaniel Veillard <veillard@redhat.com>
Wed, 22 Aug 2012 08:09:26 +0000 (16:09 +0800)
Introduce qemuSetupCgroupEmulatorPin() function to add emulator
threads pin info to cpuset cgroup, the same as vcpupin.

Signed-off-by: Tang Chen <tangchen@cn.fujitsu.com>
Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
src/qemu/qemu_cgroup.c
src/qemu/qemu_cgroup.h

index 37874d33ed8e24e596caa8769ece0c046b559ce7..9bebfd5dafc2ff9676be30424ea2f786eba8c9e9 100644 (file)
@@ -496,29 +496,40 @@ int qemuSetupCgroupVcpuPin(virCgroupPtr cgroup,
                            int nvcpupin,
                            int vcpuid)
 {
-    int i, rc = 0;
-    char *new_cpus = NULL;
+    int i;
 
     for (i = 0; i < nvcpupin; i++) {
         if (vcpuid == vcpupin[i]->vcpuid) {
-            new_cpus = virDomainCpuSetFormat(vcpupin[i]->cpumask,
-                                             VIR_DOMAIN_CPUMASK_LEN);
-            if (!new_cpus) {
-                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                               _("failed to convert cpu mask"));
-                rc = -1;
-                goto cleanup;
-            }
-            rc = virCgroupSetCpusetCpus(cgroup, new_cpus);
-            if (rc != 0) {
-                virReportSystemError(-rc,
-                                     "%s",
-                                     _("Unable to set cpuset.cpus"));
-                goto cleanup;
-            }
+            return qemuSetupCgroupEmulatorPin(cgroup, vcpupin[i]);
         }
     }
 
+    return -1;
+}
+
+int qemuSetupCgroupEmulatorPin(virCgroupPtr cgroup,
+                               virDomainVcpuPinDefPtr vcpupin)
+{
+    int rc = 0;
+    char *new_cpus = NULL;
+
+    new_cpus = virDomainCpuSetFormat(vcpupin->cpumask,
+                                     VIR_DOMAIN_CPUMASK_LEN);
+    if (!new_cpus) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("failed to convert cpu mask"));
+        rc = -1;
+        goto cleanup;
+    }
+
+    rc = virCgroupSetCpusetCpus(cgroup, new_cpus);
+    if (rc < 0) {
+        virReportSystemError(-rc,
+                             "%s",
+                             _("Unable to set cpuset.cpus"));
+        goto cleanup;
+    }
+
 cleanup:
     VIR_FREE(new_cpus);
     return rc;
@@ -636,6 +647,7 @@ int qemuSetupCgroupForEmulator(struct qemud_driver *driver,
 {
     virCgroupPtr cgroup = NULL;
     virCgroupPtr cgroup_emulator = NULL;
+    virDomainDefPtr def = vm->def;
     int rc, i;
 
     if (driver->cgroup == NULL)
@@ -672,6 +684,11 @@ int qemuSetupCgroupForEmulator(struct qemud_driver *driver,
         }
     }
 
+    if (def->cputune.emulatorpin &&
+        qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_CPUSET) &&
+        qemuSetupCgroupEmulatorPin(cgroup_emulator, def->cputune.emulatorpin) < 0)
+        goto cleanup;
+
     virCgroupFree(&cgroup_emulator);
     virCgroupFree(&cgroup);
     return 0;
index fa93cdb01289479bae33766221806422371628b2..04f70a1012d9358265c22e74f70d1a593997c1cd 100644 (file)
@@ -57,6 +57,7 @@ int qemuSetupCgroupVcpuPin(virCgroupPtr cgroup,
                            virDomainVcpuPinDefPtr *vcpupin,
                            int nvcpupin,
                            int vcpuid);
+int qemuSetupCgroupEmulatorPin(virCgroupPtr cgroup, virDomainVcpuPinDefPtr vcpupin);
 int qemuSetupCgroupForVcpu(struct qemud_driver *driver, virDomainObjPtr vm);
 int qemuSetupCgroupForEmulator(struct qemud_driver *driver,
                                virDomainObjPtr vm);