]> git.ipfire.org Git - thirdparty/libcgroup.git/commitdiff
api.c: change cgroup of every thread of a process
authorNikola Forró <nforro@redhat.com>
Tue, 8 Dec 2015 16:09:08 +0000 (17:09 +0100)
committerJan Safranek <jsafrane@redhat.com>
Wed, 9 Dec 2015 13:22:00 +0000 (14:22 +0100)
When changing cgroup of multi-threaded process, only the main threads
cgroup actually changed. Now all threads of a process are enumerated
and cgroup is changed for each of them.

src/api.c

index ef796acd427e01a2c1e484e989c413936ad8c21c..0bf0615fec978e51bbb84ab9357d9f2fad3f48fd 100644 (file)
--- a/src/api.c
+++ b/src/api.c
@@ -3293,10 +3293,13 @@ int cgroup_change_all_cgroups(void)
                return -ECGOTHER;
 
        while ((pid_dir = readdir(dir)) != NULL) {
-               int err, pid;
+               int err, pid, tid;
                uid_t euid;
                gid_t egid;
                char *procname = NULL;
+               DIR *tdir;
+               struct dirent *tid_dir = NULL;
+               char tpath[FILENAME_MAX] = { '\0' };
 
                err = sscanf(pid_dir->d_name, "%i", &pid);
                if (err < 1)
@@ -3310,11 +3313,24 @@ int cgroup_change_all_cgroups(void)
                if (err)
                        continue;
 
-               err = cgroup_change_cgroup_flags(euid,
-                               egid, procname, pid, CGFLAG_USECACHE);
-               if (err)
-                       cgroup_dbg("cgroup change pid %i failed\n", pid);
+               snprintf(tpath, FILENAME_MAX, "%s%d/task/", path, pid);
+
+               tdir = opendir(tpath);
+               if (!tdir)
+                       continue;
+
+               while ((tid_dir = readdir(tdir)) != NULL) {
+                       err = sscanf(tid_dir->d_name, "%i", &tid);
+                       if (err < 1)
+                               continue;
+
+                       err = cgroup_change_cgroup_flags(euid,
+                                       egid, procname, tid, CGFLAG_USECACHE);
+                       if (err)
+                               cgroup_dbg("cgroup change tid %i failed\n", tid);
+               }
 
+               closedir(tdir);
                free(procname);
        }