Make sure that we only switch the cgroup namespace and enter a new cgroup in a child process separate from test_progs, to not mess up the environment for subsequent tests. Signed-off-by: Kumar Kartikeya Dwivedi --- .../selftests/bpf/prog_tests/cgrp_kfunc.c | 76 +++++++++++++++++++ .../selftests/bpf/progs/cgrp_kfunc_success.c | 12 +++ 2 files changed, 88 insertions(+) diff --git a/tools/testing/selftests/bpf/prog_tests/cgrp_kfunc.c b/tools/testing/selftests/bpf/prog_tests/cgrp_kfunc.c index adda85f97058..e75a29728f9c 100644 --- a/tools/testing/selftests/bpf/prog_tests/cgrp_kfunc.c +++ b/tools/testing/selftests/bpf/prog_tests/cgrp_kfunc.c @@ -4,6 +4,7 @@ #define _GNU_SOURCE #include #include +#include #include "cgrp_kfunc_failure.skel.h" #include "cgrp_kfunc_success.skel.h" @@ -87,6 +88,78 @@ static const char * const success_tests[] = { "test_cgrp_from_id", }; +static void test_cgrp_from_id_ns(void) +{ + LIBBPF_OPTS(bpf_test_run_opts, opts); + struct cgrp_kfunc_success *skel; + struct bpf_program *prog; + int fd, pid, pipe_fd[2]; + + skel = open_load_cgrp_kfunc_skel(); + if (!ASSERT_OK_PTR(skel, "open_load_skel")) + return; + + if (!ASSERT_OK(skel->bss->err, "pre_mkdir_err")) + goto cleanup; + + prog = bpf_object__find_program_by_name(skel->obj, "test_cgrp_from_id_ns"); + if (!ASSERT_OK_PTR(prog, "bpf_object__find_program_by_name")) + goto cleanup; + + if (!ASSERT_OK(pipe(pipe_fd), "pipe")) + goto cleanup; + + pid = fork(); + if (!ASSERT_GE(pid, 0, "fork result")) + goto pipe_cleanup; + + if (pid == 0) { + int ret = 1; + + close(pipe_fd[0]); + fd = create_and_get_cgroup("cgrp_from_id_ns"); + if (!ASSERT_GE(fd, 0, "cgrp_fd")) + _exit(1); + + if (!ASSERT_OK(join_cgroup("cgrp_from_id_ns"), "join cgrp")) + goto fail; + + if (!ASSERT_OK(unshare(CLONE_NEWCGROUP), "unshare cgns")) + goto fail; + + ret = bpf_prog_test_run_opts(bpf_program__fd(prog), &opts); + if (!ASSERT_OK(ret, "test run ret")) + goto fail; + + remove_cgroup("cgrp_from_id_ns"); + + if (!ASSERT_OK(opts.retval, "test run retval")) + _exit(1); + ret = 0; + close(fd); + if (!ASSERT_EQ(write(pipe_fd[1], &ret, sizeof(ret)), sizeof(ret), "write pipe")) + _exit(1); + + _exit(0); +fail: + remove_cgroup("cgrp_from_id_ns"); + _exit(1); + } else { + int res; + + close(pipe_fd[1]); + if (!ASSERT_EQ(read(pipe_fd[0], &res, sizeof(res)), sizeof(res), "read res")) + goto pipe_cleanup; + if (!ASSERT_OK(res, "result from run")) + goto pipe_cleanup; + } + +pipe_cleanup: + close(pipe_fd[1]); +cleanup: + cgrp_kfunc_success__destroy(skel); +} + void test_cgrp_kfunc(void) { int i, err; @@ -102,6 +175,9 @@ void test_cgrp_kfunc(void) run_success_test(success_tests[i]); } + if (test__start_subtest("test_cgrp_from_id_ns")) + test_cgrp_from_id_ns(); + RUN_TESTS(cgrp_kfunc_failure); cleanup: diff --git a/tools/testing/selftests/bpf/progs/cgrp_kfunc_success.c b/tools/testing/selftests/bpf/progs/cgrp_kfunc_success.c index 5354455a01be..02d8f160ca0e 100644 --- a/tools/testing/selftests/bpf/progs/cgrp_kfunc_success.c +++ b/tools/testing/selftests/bpf/progs/cgrp_kfunc_success.c @@ -221,3 +221,15 @@ int BPF_PROG(test_cgrp_from_id, struct cgroup *cgrp, const char *path) return 0; } + +SEC("syscall") +int test_cgrp_from_id_ns(void *ctx) +{ + struct cgroup *cg; + + cg = bpf_cgroup_from_id(1); + if (!cg) + return 42; + bpf_cgroup_release(cg); + return 0; +} -- 2.47.3