[libvirt] [PATCH v1 rebase 4/6] create cgroup controllers for vcpu according to config

Hu Tao hutao at cn.fujitsu.com
Thu Dec 13 07:01:28 UTC 2012


Add a parameter to virCgroupForVcpu to indicate which
cgroup controllers to create. The value of the parameter
is read from user config.
---
 src/qemu/qemu_cgroup.c |  3 ++-
 src/qemu/qemu_driver.c | 18 ++++++++++++------
 src/util/cgroup.c      |  9 +++++++--
 src/util/cgroup.h      |  3 ++-
 4 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
index b868269..5a1bf7e 100644
--- a/src/qemu/qemu_cgroup.c
+++ b/src/qemu/qemu_cgroup.c
@@ -576,7 +576,8 @@ int qemuSetupCgroupForVcpu(virQEMUDriverPtr driver, virDomainObjPtr vm)
     }
 
     for (i = 0; i < priv->nvcpupids; i++) {
-        rc = virCgroupForVcpu(cgroup, i, &cgroup_vcpu, 1);
+        rc = virCgroupForVcpu(cgroup, i, &cgroup_vcpu, 1,
+                              driver->cgroupControllers);
         if (rc < 0) {
             virReportSystemError(-rc,
                                  _("Unable to create vcpu cgroup for %s(vcpu:"
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 2b915ff..005dc8a 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3829,7 +3829,8 @@ static int qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
             if (cgroup_available) {
                 int rv = -1;
                 /* Create cgroup for the onlined vcpu */
-                rv = virCgroupForVcpu(cgroup, i, &cgroup_vcpu, 1);
+                rv = virCgroupForVcpu(cgroup, i, &cgroup_vcpu, 1,
+                                      driver->cgroupControllers);
                 if (rv < 0) {
                     virReportSystemError(-rv,
                                          _("Unable to create vcpu cgroup for %s(vcpu:"
@@ -3903,7 +3904,8 @@ static int qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
             if (cgroup_available) {
                 int rv = -1;
 
-                rv = virCgroupForVcpu(cgroup, i, &cgroup_vcpu, 0);
+                rv = virCgroupForVcpu(cgroup, i, &cgroup_vcpu, 0,
+                                      driver->cgroupControllers);
                 if (rv < 0) {
                     virReportSystemError(-rv,
                                          _("Unable to access vcpu cgroup for %s(vcpu:"
@@ -4150,7 +4152,8 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
         if (qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_CPUSET)) {
             if (virCgroupForDomain(driver->cgroup, vm->def->name, &cgroup_dom, 0,
                                    driver->cgroupControllers) == 0 &&
-                virCgroupForVcpu(cgroup_dom, vcpu, &cgroup_vcpu, 0) == 0 &&
+                virCgroupForVcpu(cgroup_dom, vcpu, &cgroup_vcpu, 0,
+                                 driver->cgroupControllers) == 0 &&
                 qemuSetupCgroupVcpuPin(cgroup_vcpu, newVcpuPin, newVcpuPinNum, vcpu) < 0) {
                 virReportError(VIR_ERR_OPERATION_INVALID,
                                _("failed to set cpuset.cpus in cgroup"
@@ -8005,7 +8008,8 @@ qemuSetVcpusBWLive(virDomainObjPtr vm, virCgroupPtr cgroup,
      */
     if (priv->nvcpupids != 0 && priv->vcpupids[0] != vm->pid) {
         for (i = 0; i < priv->nvcpupids; i++) {
-            rc = virCgroupForVcpu(cgroup, i, &cgroup_vcpu, 0);
+            rc = virCgroupForVcpu(cgroup, i, &cgroup_vcpu, 0,
+                                  qemu_driver->cgroupControllers);
             if (rc < 0) {
                 virReportSystemError(-rc,
                                      _("Unable to find vcpu cgroup for %s(vcpu:"
@@ -8296,7 +8300,8 @@ qemuGetVcpusBWLive(virDomainObjPtr vm, virCgroupPtr cgroup,
     }
 
     /* get period and quota for vcpu0 */
-    rc = virCgroupForVcpu(cgroup, 0, &cgroup_vcpu, 0);
+    rc = virCgroupForVcpu(cgroup, 0, &cgroup_vcpu, 0,
+                          qemu_driver->cgroupControllers);
     if (!cgroup_vcpu) {
         virReportSystemError(-rc,
                              _("Unable to find vcpu cgroup for %s(vcpu: 0)"),
@@ -14386,7 +14391,8 @@ getSumVcpuPercpuStats(virCgroupPtr group,
         unsigned long long tmp;
         int j;
 
-        if (virCgroupForVcpu(group, i, &group_vcpu, 0) < 0) {
+        if (virCgroupForVcpu(group, i, &group_vcpu, 0,
+                             qemu_driver->cgroupControllers) < 0) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                            _("error accessing cgroup cpuacct for vcpu"));
             goto cleanup;
diff --git a/src/util/cgroup.c b/src/util/cgroup.c
index f3e4185..8b117f3 100644
--- a/src/util/cgroup.c
+++ b/src/util/cgroup.c
@@ -1069,14 +1069,19 @@ int virCgroupForDomain(virCgroupPtr driver ATTRIBUTE_UNUSED,
 int virCgroupForVcpu(virCgroupPtr driver,
                      int vcpuid,
                      virCgroupPtr *group,
-                     bool create)
+                     bool create,
+                     int controllers)
 {
+    unsigned flags = VIR_CGROUP_VCPU;
     int rc;
     char *path;
 
     if (driver == NULL)
         return -EINVAL;
 
+    if (!(controllers & (1UL << VIR_CGROUP_CONTROLLER_CPUSET)))
+        flags |= VIR_CGROUP_DISABLE_CPUSET;
+
     if (virAsprintf(&path, "%s/vcpu%d", driver->path, vcpuid) < 0)
         return -ENOMEM;
 
@@ -1084,7 +1089,7 @@ int virCgroupForVcpu(virCgroupPtr driver,
     VIR_FREE(path);
 
     if (rc == 0) {
-        rc = virCgroupMakeGroup(driver, *group, create, VIR_CGROUP_VCPU);
+        rc = virCgroupMakeGroup(driver, *group, create, flags);
         if (rc != 0)
             virCgroupFree(group);
     }
diff --git a/src/util/cgroup.h b/src/util/cgroup.h
index f632240..4b5cc5c 100644
--- a/src/util/cgroup.h
+++ b/src/util/cgroup.h
@@ -59,7 +59,8 @@ int virCgroupForDomain(virCgroupPtr driver,
 int virCgroupForVcpu(virCgroupPtr driver,
                      int vcpuid,
                      virCgroupPtr *group,
-                     bool create);
+                     bool create,
+                     int controllers);
 
 int virCgroupForEmulator(virCgroupPtr driver,
                          virCgroupPtr *group,
-- 
1.8.0.1.240.ge8a1f5a




More information about the libvir-list mailing list