Blame SOURCES/libcgroup-0.41-change-cgroup-of-threads.patch

1c5b3f
From c9d651cfd532da6494dab03190c0a207cdf7289c Mon Sep 17 00:00:00 2001
1c5b3f
From: =?UTF-8?q?Nikola=20Forr=C3=B3?= <nforro@redhat.com>
1c5b3f
Date: Mon, 23 Jul 2018 17:38:26 +0200
1c5b3f
Subject: [PATCH] api.c: always move all tasks of a process to a cgroup
1c5b3f
1c5b3f
---
1c5b3f
 src/api.c | 40 ++++++++++++++++++++++++++++++++++++++--
1c5b3f
 1 file changed, 38 insertions(+), 2 deletions(-)
1c5b3f
1c5b3f
diff --git a/src/api.c b/src/api.c
1c5b3f
index 803ff35..a2cf981 100644
1c5b3f
--- a/src/api.c
1c5b3f
+++ b/src/api.c
1c5b3f
@@ -3180,7 +3180,12 @@ int cgroup_change_cgroup_path(const char *dest, pid_t pid,
1c5b3f
 				const char *const controllers[])
1c5b3f
 {
1c5b3f
 	int ret;
1c5b3f
+	int nr;
1c5b3f
 	struct cgroup cgroup;
1c5b3f
+	DIR *dir;
1c5b3f
+	struct dirent *task_dir = NULL;
1c5b3f
+	char path[FILENAME_MAX];
1c5b3f
+	pid_t tid;
1c5b3f
 
1c5b3f
 	if (!cgroup_initialized) {
1c5b3f
 		cgroup_warn("Warning: libcgroup is not initialized\n");
1c5b3f
@@ -3191,11 +3196,42 @@ int cgroup_change_cgroup_path(const char *dest, pid_t pid,
1c5b3f
 	ret = cg_prepare_cgroup(&cgroup, pid, dest, controllers);
1c5b3f
 	if (ret)
1c5b3f
 		return ret;
1c5b3f
-	/* Add task to cgroup */
1c5b3f
+	/* Add process to cgroup */
1c5b3f
 	ret = cgroup_attach_task_pid(&cgroup, pid);
1c5b3f
-	if (ret)
1c5b3f
+	if (ret) {
1c5b3f
 		cgroup_warn("Warning: cgroup_attach_task_pid failed: %d\n",
1c5b3f
 				ret);
1c5b3f
+		goto finished;
1c5b3f
+	}
1c5b3f
+
1c5b3f
+	/* Add all threads to cgroup */
1c5b3f
+	snprintf(path, FILENAME_MAX, "/proc/%d/task/", pid);
1c5b3f
+	dir = opendir(path);
1c5b3f
+	if (!dir) {
1c5b3f
+		last_errno = errno;
1c5b3f
+		ret = ECGOTHER;
1c5b3f
+		goto finished;
1c5b3f
+	}
1c5b3f
+
1c5b3f
+	while ((task_dir = readdir(dir)) != NULL) {
1c5b3f
+		nr = sscanf(task_dir->d_name, "%i", &tid;;
1c5b3f
+		if (nr < 1)
1c5b3f
+			continue;
1c5b3f
+
1c5b3f
+		if (tid == pid)
1c5b3f
+			continue;
1c5b3f
+
1c5b3f
+		ret = cgroup_attach_task_pid(&cgroup, tid);
1c5b3f
+		if (ret) {
1c5b3f
+			cgroup_warn("Warning: cgroup_attach_task_pid failed: %d\n",
1c5b3f
+					ret);
1c5b3f
+			break;
1c5b3f
+		}
1c5b3f
+	}
1c5b3f
+
1c5b3f
+	closedir(dir);
1c5b3f
+
1c5b3f
+finished:
1c5b3f
 	cgroup_free_controllers(&cgroup);
1c5b3f
 	return ret;
1c5b3f
 }
1c5b3f
-- 
1c5b3f
2.17.1
1c5b3f