[libvirt] [PATCH 7/9] vircgroup: add controller mask to virCgroupAddTask

Henning Schild henning.schild at siemens.com
Tue Feb 23 15:58:42 UTC 2016


Add a way to exclude controllers from virCgroupAddTask. In a cgroup
hierarchy the parent might have controllers just to allow children
cgroups to inherit them, not necessarily to put any tasks in them.

Signed-off-by: Henning Schild <henning.schild at siemens.com>
---
 src/lxc/lxc_cgroup.c     | 2 +-
 src/lxc/lxc_controller.c | 4 ++--
 src/qemu/qemu_cgroup.c   | 8 ++++----
 src/qemu/qemu_driver.c   | 2 +-
 src/util/vircgroup.c     | 8 ++++++--
 src/util/vircgroup.h     | 2 +-
 6 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/src/lxc/lxc_cgroup.c b/src/lxc/lxc_cgroup.c
index 609e9ea..9b91dd2 100644
--- a/src/lxc/lxc_cgroup.c
+++ b/src/lxc/lxc_cgroup.c
@@ -504,7 +504,7 @@ virCgroupPtr virLXCCgroupCreate(virDomainDefPtr def,
                             &cgroup) < 0)
         goto cleanup;
 
-    if (virCgroupAddTask(cgroup, initpid) < 0) {
+    if (virCgroupAddTask(cgroup, initpid, -1) < 0) {
         virErrorPtr saved = virSaveLastError();
         virCgroupRemove(cgroup);
         virCgroupFree(&cgroup);
diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
index 438103a..b1fe8fa 100644
--- a/src/lxc/lxc_controller.c
+++ b/src/lxc/lxc_controller.c
@@ -863,12 +863,12 @@ static int virLXCControllerSetupCgroupLimits(virLXCControllerPtr ctrl)
                                             ctrl->nicindexes)))
         goto cleanup;
 
-    if (virCgroupAddTask(ctrl->cgroup, getpid()) < 0)
+    if (virCgroupAddTask(ctrl->cgroup, getpid(), -1) < 0)
         goto cleanup;
 
     /* Add all qemu-nbd tasks to the cgroup */
     for (i = 0; i < ctrl->nnbdpids; i++) {
-        if (virCgroupAddTask(ctrl->cgroup, ctrl->nbdpids[i]) < 0)
+        if (virCgroupAddTask(ctrl->cgroup, ctrl->nbdpids[i], -1) < 0)
             goto cleanup;
     }
 
diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
index d410a66..41a583c 100644
--- a/src/qemu/qemu_cgroup.c
+++ b/src/qemu/qemu_cgroup.c
@@ -789,7 +789,7 @@ qemuInitCgroup(virQEMUDriverPtr driver,
         goto cleanup;
     }
 
-    if (virCgroupAddTask(priv->cgroup, vm->pid) < 0) {
+    if (virCgroupAddTask(priv->cgroup, vm->pid, -1) < 0) {
         virErrorPtr saved = virSaveLastError();
         virCgroupRemove(priv->cgroup);
         virCgroupFree(&priv->cgroup);
@@ -1096,7 +1096,7 @@ qemuSetupCgroupForVcpu(virDomainObjPtr vm)
 
         /* move the thread for vcpu to sub dir */
         if (virCgroupAddTask(cgroup_vcpu,
-                             qemuDomainGetVcpuPid(vm, i)) < 0)
+                             qemuDomainGetVcpuPid(vm, i), -1) < 0)
             goto cleanup;
 
     }
@@ -1145,7 +1145,7 @@ qemuSetupCgroupForEmulator(virDomainObjPtr vm)
                            true, &cgroup_emulator) < 0)
         goto cleanup;
 
-    if (virCgroupAddTask(cgroup_emulator, vm->pid) < 0)
+    if (virCgroupAddTask(cgroup_emulator, vm->pid, -1) < 0)
        goto cleanup;
 
     if (def->cputune.emulatorpin)
@@ -1255,7 +1255,7 @@ qemuSetupCgroupForIOThreads(virDomainObjPtr vm)
 
         /* move the thread for iothread to sub dir */
         if (virCgroupAddTask(cgroup_iothread,
-                             def->iothreadids[i]->thread_id) < 0)
+                             def->iothreadids[i]->thread_id, -1) < 0)
             goto cleanup;
 
         virCgroupFree(&cgroup_iothread);
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 8ccf68b..c0b840b 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4583,7 +4583,7 @@ qemuDomainAddCgroupForThread(virCgroupPtr cgroup,
         goto error;
 
     /* Add pid/thread to the cgroup */
-    rv = virCgroupAddTask(new_cgroup, pid);
+    rv = virCgroupAddTask(new_cgroup, pid, -1);
     if (rv < 0) {
         virCgroupRemove(new_cgroup);
         goto error;
diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c
index c31c83b..bbc88f3 100644
--- a/src/util/vircgroup.c
+++ b/src/util/vircgroup.c
@@ -1142,16 +1142,19 @@ virCgroupNew(pid_t pid,
  *
  * @group: The cgroup to add a task to
  * @pid: The pid of the task to add
+ * @controllers: mask of controllers to operate on
  *
  * Returns: 0 on success, -1 on error
  */
 int
-virCgroupAddTask(virCgroupPtr group, pid_t pid)
+virCgroupAddTask(virCgroupPtr group, pid_t pid, int controllers)
 {
     int ret = -1;
     size_t i;
 
     for (i = 0; i < VIR_CGROUP_CONTROLLER_LAST; i++) {
+        if (((controllers & (1 << i)) == 0))
+            continue;
         /* Skip over controllers not mounted */
         if (!group->controllers[i].mountPoint)
             continue;
@@ -4197,7 +4200,8 @@ virCgroupPathOfController(virCgroupPtr group ATTRIBUTE_UNUSED,
 
 int
 virCgroupAddTask(virCgroupPtr group ATTRIBUTE_UNUSED,
-                 pid_t pid ATTRIBUTE_UNUSED)
+                 pid_t pid ATTRIBUTE_UNUSED,
+                 int controllers ATTRIBUTE_UNUSED)
 {
     virReportSystemError(ENXIO, "%s",
                          _("Control groups not supported on this platform"));
diff --git a/src/util/vircgroup.h b/src/util/vircgroup.h
index 0286d56..d9c5100 100644
--- a/src/util/vircgroup.h
+++ b/src/util/vircgroup.h
@@ -132,7 +132,7 @@ int virCgroupPathOfController(virCgroupPtr group,
                               const char *key,
                               char **path);
 
-int virCgroupAddTask(virCgroupPtr group, pid_t pid);
+int virCgroupAddTask(virCgroupPtr group, pid_t pid, int controllers);
 
 int virCgroupAddTaskController(virCgroupPtr group,
                                pid_t pid,
-- 
2.4.10




More information about the libvir-list mailing list