]> git.proxmox.com Git - mirror_lxc.git/commitdiff
cgroup: only touch hierarchies that are bound to subsystems
authorDavid Ward <david.ward@ll.mit.edu>
Thu, 3 May 2012 22:50:15 +0000 (00:50 +0200)
committerDaniel Lezcano <daniel.lezcano@free.fr>
Thu, 3 May 2012 22:50:15 +0000 (00:50 +0200)
Obtain a list of subsystems from /proc/cgroups, and ignore hierarchies
that are not bound to any of them (especially the 'systemd' hierarchy:
http://www.freedesktop.org/wiki/Software/systemd/PaxControlGroups ).

Signed-off-by: David Ward <david.ward@ll.mit.edu>
Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
src/lxc/cgroup.c

index 7d91bbc0ad8e328be6a8ae81724f0e411b99dc42..e124499e7d9b6f3d5383f7d963d92d385cc60c8a 100644 (file)
@@ -53,6 +53,39 @@ enum {
        CGROUP_CLONE_CHILDREN,
 };
 
+/* Check if a mount is a cgroup hierarchy for any subsystem.
+ * Return the first subsystem found (or NULL if none).
+ */
+static char *mount_has_subsystem(const struct mntent *mntent)
+{
+       FILE *f;
+       char *c, *ret;
+       char line[MAXPATHLEN];
+
+       /* read the list of subsystems from the kernel */
+       f = fopen("/proc/cgroups", "r");
+       if (!f)
+               return 0;
+
+       /* skip the first line, which contains column headings */
+       if (!fgets(line, MAXPATHLEN, f))
+               return 0;
+
+       while (fgets(line, MAXPATHLEN, f)) {
+               c = strchr(line, '\t');
+               if (!c)
+                       continue;
+               *c = '\0';
+
+               ret = hasmntopt(mntent, line);
+               if (ret)
+                       break;
+       }
+
+       fclose(f);
+       return ret;
+}
+
 /*
  * get_init_cgroup: get the cgroup init is in.
  *  dsg: preallocated buffer to put the output in
@@ -139,8 +172,15 @@ static int get_cgroup_mount(const char *subsystem, char *mnt)
        while ((mntent = getmntent(file))) {
                if (strcmp(mntent->mnt_type, "cgroup"))
                        continue;
-               if (subsystem && !hasmntopt(mntent, subsystem))
-                       continue;
+
+               if (subsystem) {
+                       if (!hasmntopt(mntent, subsystem))
+                               continue;
+               }
+               else {
+                       if (!mount_has_subsystem(mntent))
+                               continue;
+               }
 
                flags = get_cgroup_flags(mntent);
                ret = snprintf(mnt, MAXPATHLEN, "%s%s%s", mntent->mnt_dir,
@@ -266,6 +306,8 @@ int lxc_cgroup_attach(const char *name, pid_t pid)
 
                if (strcmp(mntent->mnt_type, "cgroup"))
                        continue;
+               if (!mount_has_subsystem(mntent))
+                       continue;
 
                INFO("[%d] found cgroup mounted at '%s',opts='%s'",
                     ++found, mntent->mnt_dir, mntent->mnt_opts);
@@ -420,6 +462,8 @@ int lxc_cgroup_create(const char *name, pid_t pid)
 
                if (strcmp(mntent->mnt_type, "cgroup"))
                        continue;
+               if (!mount_has_subsystem(mntent))
+                       continue;
 
                INFO("[%d] found cgroup mounted at '%s',opts='%s'",
                     ++found, mntent->mnt_dir, mntent->mnt_opts);
@@ -519,6 +563,8 @@ int lxc_cgroup_destroy(const char *name)
        while ((mntent = getmntent(file))) {
                if (strcmp(mntent->mnt_type, "cgroup"))
                        continue;
+               if (!mount_has_subsystem(mntent))
+                       continue;
 
                err = lxc_one_cgroup_destroy(mntent, name);
                if (err)