On Sat, Mar 05, 2022 at 01:20:42PM -0800, Yonghong Song wrote: > > On 3/4/22 11:16 AM, Hao Luo wrote: > > Add test for percpu btf_type_tag. Similar to the "user" tag, we test > > the following cases: > > > > 1. __percpu struct field. > > 2. __percpu as function parameter. > > 3. per_cpu_ptr() accepts dynamically allocated __percpu memory. > > > > Because the test for "user" and the test for "percpu" are very similar, > > a little bit of refactoring has been done in btf_tag.c. Basically, both > > tests share the same function for loading vmlinux and module btf. > > > > Example output from log: > > > > > ./test_progs -v -t btf_tag > > > > libbpf: prog 'test_percpu1': BPF program load failed: Permission denied > > libbpf: prog 'test_percpu1': -- BEGIN PROG LOAD LOG -- > > ... > > ; g = arg->a; > > 1: (61) r1 = *(u32 *)(r1 +0) > > R1 is ptr_bpf_testmod_btf_type_tag_1 access percpu memory: off=0 > > ... > > test_btf_type_tag_mod_percpu:PASS:btf_type_tag_percpu 0 nsec > > #26/6 btf_tag/btf_type_tag_percpu_mod1:OK > > > > libbpf: prog 'test_percpu2': BPF program load failed: Permission denied > > libbpf: prog 'test_percpu2': -- BEGIN PROG LOAD LOG -- > > ... > > ; g = arg->p->a; > > 2: (61) r1 = *(u32 *)(r1 +0) > > R1 is ptr_bpf_testmod_btf_type_tag_1 access percpu memory: off=0 > > ... > > test_btf_type_tag_mod_percpu:PASS:btf_type_tag_percpu 0 nsec > > #26/7 btf_tag/btf_type_tag_percpu_mod2:OK > > > > libbpf: prog 'test_percpu_load': BPF program load failed: Permission denied > > libbpf: prog 'test_percpu_load': -- BEGIN PROG LOAD LOG -- > > ... > > ; g = (__u64)cgrp->rstat_cpu->updated_children; > > 2: (79) r1 = *(u64 *)(r1 +48) > > R1 is ptr_cgroup_rstat_cpu access percpu memory: off=48 > > ... > > test_btf_type_tag_vmlinux_percpu:PASS:btf_type_tag_percpu_load 0 nsec > > #26/8 btf_tag/btf_type_tag_percpu_vmlinux_load:OK > > > > load_btfs:PASS:could not load vmlinux BTF 0 nsec > > test_btf_type_tag_vmlinux_percpu:PASS:btf_type_tag_percpu 0 nsec > > test_btf_type_tag_vmlinux_percpu:PASS:btf_type_tag_percpu_helper 0 nsec > > #26/9 btf_tag/btf_type_tag_percpu_vmlinux_helper:OK > > > > Signed-off-by: Hao Luo <haoluo@xxxxxxxxxx> > > With one nit below. > > Acked-by: Yonghong Song <yhs@xxxxxx> > > > --- > > .../selftests/bpf/bpf_testmod/bpf_testmod.c | 17 ++ > > .../selftests/bpf/prog_tests/btf_tag.c | 164 ++++++++++++++---- > > .../selftests/bpf/progs/btf_type_tag_percpu.c | 66 +++++++ > > 3 files changed, 218 insertions(+), 29 deletions(-) > > create mode 100644 tools/testing/selftests/bpf/progs/btf_type_tag_percpu.c > > > > diff --git a/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c b/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c > > index 27d63be47b95..17c211f3b924 100644 > > --- a/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c > > +++ b/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c > > @@ -33,6 +33,10 @@ struct bpf_testmod_btf_type_tag_2 { > > struct bpf_testmod_btf_type_tag_1 __user *p; > > }; > > +struct bpf_testmod_btf_type_tag_3 { > > + struct bpf_testmod_btf_type_tag_1 __percpu *p; > > +}; > > + > > noinline int > > bpf_testmod_test_btf_type_tag_user_1(struct bpf_testmod_btf_type_tag_1 __user *arg) { > > BTF_TYPE_EMIT(func_proto_typedef); > > @@ -46,6 +50,19 @@ bpf_testmod_test_btf_type_tag_user_2(struct bpf_testmod_btf_type_tag_2 *arg) { > > return arg->p->a; > > } > > +noinline int > > +bpf_testmod_test_btf_type_tag_percpu_1(struct bpf_testmod_btf_type_tag_1 __percpu *arg) { > > + BTF_TYPE_EMIT(func_proto_typedef); > > + BTF_TYPE_EMIT(func_proto_typedef_nested1); > > + BTF_TYPE_EMIT(func_proto_typedef_nested2); > > Are these necessary? They have been defined in > bpf_testmod_test_btf_type_tag_user_1(). Yonghong, Thanks. Good catch. I've removed those while applying. Hao, Great work. I really liked how patch 3 discovers MEM_PERCPU flag from two sources: percpu_datasec and clang tag.