From 647274d80d18686a3129a2b50605869ac5178ccf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikola=20Forr=C3=B3?= Date: Tue, 8 Dec 2015 17:09:08 +0100 Subject: [PATCH 1/6] api.c: change cgroup of every thread of a process 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 | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/api.c b/src/api.c index 0cc15c6..df90a6f 100644 --- a/src/api.c +++ b/src/api.c @@ -3177,10 +3177,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) @@ -3194,11 +3197,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); } -- 2.17.0