Re: [PATCH bpf-next v1 4/4] selftests/bpf: Add a test for btf_type_tag "percpu"

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




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().

+	return arg->a;
+}
+
[...]



[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux