selftests: cgroup: Simplify task self migration
authorMichal Koutný <mkoutny@suse.com>
Fri, 4 Oct 2019 10:57:41 +0000 (12:57 +0200)
committerTejun Heo <tj@kernel.org>
Mon, 7 Oct 2019 14:11:54 +0000 (07:11 -0700)
Simplify task migration by being oblivious about its PID during
migration. This allows to easily migrate individual threads as well.
This change brings no functional change and prepares grounds for thread
granularity migrating tests.

Signed-off-by: Michal Koutný <mkoutny@suse.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
tools/testing/selftests/cgroup/cgroup_util.c
tools/testing/selftests/cgroup/cgroup_util.h
tools/testing/selftests/cgroup/test_freezer.c

index bdb69599c4bdc2526943cf9a690e1ef0697872dd..f6573eac136561a14d3f52be0ea90527432d7bba 100644 (file)
@@ -282,10 +282,12 @@ int cg_enter(const char *cgroup, int pid)
 
 int cg_enter_current(const char *cgroup)
 {
-       char pidbuf[64];
+       return cg_write(cgroup, "cgroup.procs", "0");
+}
 
-       snprintf(pidbuf, sizeof(pidbuf), "%d", getpid());
-       return cg_write(cgroup, "cgroup.procs", pidbuf);
+int cg_enter_current_thread(const char *cgroup)
+{
+       return cg_write(cgroup, "cgroup.threads", "0");
 }
 
 int cg_run(const char *cgroup,
@@ -410,11 +412,15 @@ int set_oom_adj_score(int pid, int score)
        return 0;
 }
 
-char proc_read_text(int pid, const char *item, char *buf, size_t size)
+ssize_t proc_read_text(int pid, bool thread, const char *item, char *buf, size_t size)
 {
        char path[PATH_MAX];
 
-       snprintf(path, sizeof(path), "/proc/%d/%s", pid, item);
+       if (!pid)
+               snprintf(path, sizeof(path), "/proc/%s/%s",
+                        thread ? "thread-self" : "self", item);
+       else
+               snprintf(path, sizeof(path), "/proc/%d/%s", pid, item);
 
        return read_text(path, buf, size);
 }
index c72f28046bfa28e502a9c200d02559bdade4836c..27ff21d82af1cdd19ac097f7d22ec19906588fb5 100644 (file)
@@ -1,4 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
+#include <stdbool.h>
 #include <stdlib.h>
 
 #define PAGE_SIZE 4096
@@ -35,6 +36,7 @@ extern int cg_run(const char *cgroup,
                  void *arg);
 extern int cg_enter(const char *cgroup, int pid);
 extern int cg_enter_current(const char *cgroup);
+extern int cg_enter_current_thread(const char *cgroup);
 extern int cg_run_nowait(const char *cgroup,
                         int (*fn)(const char *cgroup, void *arg),
                         void *arg);
@@ -45,4 +47,4 @@ extern int is_swap_enabled(void);
 extern int set_oom_adj_score(int pid, int score);
 extern int cg_wait_for_proc_count(const char *cgroup, int count);
 extern int cg_killall(const char *cgroup);
-extern char proc_read_text(int pid, const char *item, char *buf, size_t size);
+extern ssize_t proc_read_text(int pid, bool thread, const char *item, char *buf, size_t size);
index 0fc1b6d4b0f9c4db9084158fd22b755e7b53482f..aadc52a1a1b124f3aa9defd6f8452c2967a7d47b 100644 (file)
@@ -701,7 +701,7 @@ static int proc_check_stopped(int pid)
        char buf[PAGE_SIZE];
        int len;
 
-       len = proc_read_text(pid, "stat", buf, sizeof(buf));
+       len = proc_read_text(pid, 0, "stat", buf, sizeof(buf));
        if (len == -1) {
                debug("Can't get %d stat\n", pid);
                return -1;