set Delegate property for cgconfig service to make sure complete cgroup hierarchy is always created by systemd
64 lines
1.7 KiB
Diff
64 lines
1.7 KiB
Diff
From 647274d80d18686a3129a2b50605869ac5178ccf Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Nikola=20Forr=C3=B3?= <nforro@redhat.com>
|
|
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
|
|
|