On Wed, Dec 6, 2023 at 12:24 PM Yonghong Song <yonghong.song@xxxxxxxxx> wrote: > > > On 12/5/23 9:37 AM, Yafang Shao wrote: > > Expanding the test coverage from cgroup2 to include cgroup1. The result > > as follows, > > > > Already existing test cases for cgroup2: > > #48/1 cgrp_local_storage/tp_btf:OK > > #48/2 cgrp_local_storage/attach_cgroup:OK > > #48/3 cgrp_local_storage/recursion:OK > > #48/4 cgrp_local_storage/negative:OK > > #48/5 cgrp_local_storage/cgroup_iter_sleepable:OK > > #48/6 cgrp_local_storage/yes_rcu_lock:OK > > #48/7 cgrp_local_storage/no_rcu_lock:OK > > > > Expanded test cases for cgroup1: > > #48/8 cgrp_local_storage/cgrp1_tp_btf:OK > > #48/9 cgrp_local_storage/cgrp1_recursion:OK > > #48/10 cgrp_local_storage/cgrp1_negative:OK > > #48/11 cgrp_local_storage/cgrp1_iter_sleepable:OK > > #48/12 cgrp_local_storage/cgrp1_yes_rcu_lock:OK > > #48/13 cgrp_local_storage/cgrp1_no_rcu_lock:OK > > > > Summary: > > #48 cgrp_local_storage:OK > > Summary: 1/13 PASSED, 0 SKIPPED, 0 FAILED > > > > Signed-off-by: Yafang Shao <laoar.shao@xxxxxxxxx> > > LGTM with a few nits below. > > Acked-by: Yonghong Song <yonghong.song@xxxxxxxxx> > > > --- > > .../bpf/prog_tests/cgrp_local_storage.c | 92 ++++++++++++++++++- > > .../selftests/bpf/progs/cgrp_ls_recursion.c | 84 +++++++++++++---- > > .../selftests/bpf/progs/cgrp_ls_sleepable.c | 67 ++++++++++++-- > > .../selftests/bpf/progs/cgrp_ls_tp_btf.c | 82 ++++++++++++----- > > 4 files changed, 278 insertions(+), 47 deletions(-) > > > > diff --git a/tools/testing/selftests/bpf/prog_tests/cgrp_local_storage.c b/tools/testing/selftests/bpf/prog_tests/cgrp_local_storage.c > > index 63e776f4176e..9524cde4cbf6 100644 > > --- a/tools/testing/selftests/bpf/prog_tests/cgrp_local_storage.c > > +++ b/tools/testing/selftests/bpf/prog_tests/cgrp_local_storage.c > > @@ -19,6 +19,9 @@ struct socket_cookie { > > __u64 cookie_value; > > }; > > > > +bool is_cgroup1; > > +int target_hid; > > + > > static void test_tp_btf(int cgroup_fd) > > { > > struct cgrp_ls_tp_btf *skel; > > @@ -29,6 +32,9 @@ static void test_tp_btf(int cgroup_fd) > > if (!ASSERT_OK_PTR(skel, "skel_open_and_load")) > > return; > > > > + skel->bss->is_cgroup1 = is_cgroup1; > > + skel->bss->target_hid = target_hid; > > Let reverse the order like below to be consistent with other code patterns: will change it. > + skel->bss->target_hid = target_hid; > + skel->bss->is_cgroup1 = is_cgroup1; > > > + > > /* populate a value in map_b */ > > err = bpf_map_update_elem(bpf_map__fd(skel->maps.map_b), &cgroup_fd, &val1, BPF_ANY); > > if (!ASSERT_OK(err, "map_update_elem")) > > @@ -130,6 +136,9 @@ static void test_recursion(int cgroup_fd) > > if (!ASSERT_OK_PTR(skel, "skel_open_and_load")) > > return; > > > > + skel->bss->target_hid = target_hid; > > + skel->bss->is_cgroup1 = is_cgroup1; > > + > > err = cgrp_ls_recursion__attach(skel); > > if (!ASSERT_OK(err, "skel_attach")) > > goto out; > > [...] > > diff --git a/tools/testing/selftests/bpf/progs/cgrp_ls_sleepable.c b/tools/testing/selftests/bpf/progs/cgrp_ls_sleepable.c > > index 4c7844e1dbfa..985ff419249c 100644 > > --- a/tools/testing/selftests/bpf/progs/cgrp_ls_sleepable.c > > +++ b/tools/testing/selftests/bpf/progs/cgrp_ls_sleepable.c > > @@ -17,7 +17,11 @@ struct { > > > > __u32 target_pid; > > __u64 cgroup_id; > > +int target_hid; > > +bool is_cgroup1; > > > > +struct cgroup *bpf_task_get_cgroup1(struct task_struct *task, int hierarchy_id) __ksym; > > +void bpf_cgroup_release(struct cgroup *cgrp) __ksym; > > void bpf_rcu_read_lock(void) __ksym; > > void bpf_rcu_read_unlock(void) __ksym; > > > > @@ -37,23 +41,56 @@ int cgroup_iter(struct bpf_iter__cgroup *ctx) > > return 0; > > } > > > > +static void __no_rcu_lock(struct cgroup *cgrp) > > +{ > > + long *ptr; > > + > > + /* Note that trace rcu is held in sleepable prog, so we can use > > + * bpf_cgrp_storage_get() in sleepable prog. > > + */ > > + ptr = bpf_cgrp_storage_get(&map_a, cgrp, 0, > > + BPF_LOCAL_STORAGE_GET_F_CREATE); > > + if (ptr) > > + cgroup_id = cgrp->kn->id; > > +} > > + > > SEC("?fentry.s/" SYS_PREFIX "sys_getpgid") > > -int no_rcu_lock(void *ctx) > > +int cgrp1_no_rcu_lock(void *ctx) > > { > > struct task_struct *task; > > struct cgroup *cgrp; > > - long *ptr; > > + > > + if (!is_cgroup1) > > + return 0; > > Do we need this check? Looks like the user space controls whether it will > be loaded or not depending on whether it is cgrp1. will remove this check. > > > + > > + task = bpf_get_current_task_btf(); > > + if (task->pid != target_pid) > > + return 0; > > + > > + /* bpf_task_get_cgroup1 can work in sleepable prog */ > > + cgrp = bpf_task_get_cgroup1(task, target_hid); > > + if (!cgrp) > > + return 0; > > + > > + __no_rcu_lock(cgrp); > > + bpf_cgroup_release(cgrp); > > + return 0; > > +} > > + > > +SEC("?fentry.s/" SYS_PREFIX "sys_getpgid") > > +int no_rcu_lock(void *ctx) > > +{ > > + struct task_struct *task; > > + > > + if (is_cgroup1) > > + return 0; > > Same here, check is not needed. will remove it. Thanks for your review. -- Regards Yafang