selftests/bpf: Add selftest for bpf_task_under_cgroup() in sleepable prog
authorYafang Shao <laoar.shao@gmail.com>
Sat, 7 Oct 2023 13:59:45 +0000 (13:59 +0000)
committerDaniel Borkmann <daniel@iogearbox.net>
Tue, 17 Oct 2023 16:31:27 +0000 (18:31 +0200)
The result is as follows:

  $ tools/testing/selftests/bpf/test_progs --name=task_under_cgroup
  #237     task_under_cgroup:OK
  Summary: 1/0 PASSED, 0 SKIPPED, 0 FAILED

Without the previous patch, there will be RCU warnings in dmesg when
CONFIG_PROVE_RCU is enabled. While with the previous patch, there will
be no warnings.

Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Stanislav Fomichev <sdf@google.com>
Link: https://lore.kernel.org/bpf/20231007135945.4306-2-laoar.shao@gmail.com
tools/testing/selftests/bpf/prog_tests/task_under_cgroup.c
tools/testing/selftests/bpf/progs/test_task_under_cgroup.c

index 4224727fb36448c6ec5f90fced8cc5d6e1804d08..626d76fe43a210ae1d80f66211693c87bf22c310 100644 (file)
@@ -30,8 +30,15 @@ void test_task_under_cgroup(void)
        if (!ASSERT_OK(ret, "test_task_under_cgroup__load"))
                goto cleanup;
 
-       ret = test_task_under_cgroup__attach(skel);
-       if (!ASSERT_OK(ret, "test_task_under_cgroup__attach"))
+       /* First, attach the LSM program, and then it will be triggered when the
+        * TP_BTF program is attached.
+        */
+       skel->links.lsm_run = bpf_program__attach_lsm(skel->progs.lsm_run);
+       if (!ASSERT_OK_PTR(skel->links.lsm_run, "attach_lsm"))
+               goto cleanup;
+
+       skel->links.tp_btf_run = bpf_program__attach_trace(skel->progs.tp_btf_run);
+       if (!ASSERT_OK_PTR(skel->links.tp_btf_run, "attach_tp_btf"))
                goto cleanup;
 
        pid = fork();
index 56cdc0a553f0862164199d5a2b345b30c5691122..7e750309ce274c888da62b95c839b6cb46c2b89d 100644 (file)
@@ -18,7 +18,7 @@ const volatile __u64 cgid;
 int remote_pid;
 
 SEC("tp_btf/task_newtask")
-int BPF_PROG(handle__task_newtask, struct task_struct *task, u64 clone_flags)
+int BPF_PROG(tp_btf_run, struct task_struct *task, u64 clone_flags)
 {
        struct cgroup *cgrp = NULL;
        struct task_struct *acquired;
@@ -48,4 +48,30 @@ out:
        return 0;
 }
 
+SEC("lsm.s/bpf")
+int BPF_PROG(lsm_run, int cmd, union bpf_attr *attr, unsigned int size)
+{
+       struct cgroup *cgrp = NULL;
+       struct task_struct *task;
+       int ret = 0;
+
+       task = bpf_get_current_task_btf();
+       if (local_pid != task->pid)
+               return 0;
+
+       if (cmd != BPF_LINK_CREATE)
+               return 0;
+
+       /* 1 is the root cgroup */
+       cgrp = bpf_cgroup_from_id(1);
+       if (!cgrp)
+               goto out;
+       if (!bpf_task_under_cgroup(task, cgrp))
+               ret = -1;
+       bpf_cgroup_release(cgrp);
+
+out:
+       return ret;
+}
+
 char _license[] SEC("license") = "GPL";