Thanks for the patch, it has been applied to master branch of libcgroup.
Jan
On 12/08/2015 05:09 PM, Nikola Forró wrote:
> 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 ef796ac..0bf0615 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);
> }
>
>
------------------------------------------------------------------------------
_______________________________________________
Libcg-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libcg-devel