From: Nikola Forró Date: Tue, 8 Dec 2015 16:09:08 +0000 (+0100) Subject: api.c: change cgroup of every thread of a process X-Git-Tag: v0.42.rc1~37 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2186c97;p=thirdparty%2Flibcgroup.git 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. --- diff --git a/src/api.c b/src/api.c index ef796acd..0bf0615f 100644 --- 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); }