[PATCH bpf-next v1 3/4] selftests/bpf: Test accessing struct_ops this pointer

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

 



Test struct_ops this pointer using bpf_testmod_ops3. Add an integer
field, data, to bpf_testmod_ops3 and a kfunc that reads data through
aux->this_st_ops. Check if the kfunc reads the correct value of data.

Signed-off-by: Amery Hung <ameryhung@xxxxxxxxx>
---
 .../bpf/prog_tests/test_struct_ops_this_ptr.c | 10 ++++++
 .../progs/struct_ops_private_stack_recur.c    |  3 +-
 .../selftests/bpf/progs/struct_ops_this_ptr.c | 30 ++++++++++++++++
 .../selftests/bpf/test_kmods/bpf_testmod.c    | 36 +++++++++++++++++--
 .../selftests/bpf/test_kmods/bpf_testmod.h    |  1 +
 .../bpf/test_kmods/bpf_testmod_kfunc.h        |  3 ++
 6 files changed, 78 insertions(+), 5 deletions(-)
 create mode 100644 tools/testing/selftests/bpf/prog_tests/test_struct_ops_this_ptr.c
 create mode 100644 tools/testing/selftests/bpf/progs/struct_ops_this_ptr.c

diff --git a/tools/testing/selftests/bpf/prog_tests/test_struct_ops_this_ptr.c b/tools/testing/selftests/bpf/prog_tests/test_struct_ops_this_ptr.c
new file mode 100644
index 000000000000..6ef238a2050a
--- /dev/null
+++ b/tools/testing/selftests/bpf/prog_tests/test_struct_ops_this_ptr.c
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include <test_progs.h>
+
+#include "struct_ops_this_ptr.skel.h"
+
+void serial_test_struct_ops_this_ptr(void)
+{
+	RUN_TESTS(struct_ops_this_ptr);
+}
diff --git a/tools/testing/selftests/bpf/progs/struct_ops_private_stack_recur.c b/tools/testing/selftests/bpf/progs/struct_ops_private_stack_recur.c
index 31e58389bb8b..215b675ddf94 100644
--- a/tools/testing/selftests/bpf/progs/struct_ops_private_stack_recur.c
+++ b/tools/testing/selftests/bpf/progs/struct_ops_private_stack_recur.c
@@ -4,6 +4,7 @@
 #include <bpf/bpf_helpers.h>
 #include <bpf/bpf_tracing.h>
 #include "../test_kmods/bpf_testmod.h"
+#include "../test_kmods/bpf_testmod_kfunc.h"
 
 char _license[] SEC("license") = "GPL";
 
@@ -13,8 +14,6 @@ bool skip __attribute((__section__(".data"))) = false;
 bool skip = true;
 #endif
 
-void bpf_testmod_ops3_call_test_1(void) __ksym;
-
 int val_i, val_j;
 
 __noinline static int subprog2(int *a, int *b)
diff --git a/tools/testing/selftests/bpf/progs/struct_ops_this_ptr.c b/tools/testing/selftests/bpf/progs/struct_ops_this_ptr.c
new file mode 100644
index 000000000000..e5a6463c27ad
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/struct_ops_this_ptr.c
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include <vmlinux.h>
+#include <bpf/bpf_tracing.h>
+#include "../test_kmods/bpf_testmod.h"
+#include "../test_kmods/bpf_testmod_kfunc.h"
+#include "bpf_misc.h"
+
+char _license[] SEC("license") = "GPL";
+
+SEC("struct_ops")
+int BPF_PROG(test1)
+{
+	return bpf_kfunc_st_ops_test_this_ptr_impl(NULL);
+}
+
+SEC("syscall")
+__success __retval(1234)
+int syscall_this_ptr(void *ctx)
+{
+	return bpf_testmod_ops3_call_test_1();
+}
+
+SEC(".struct_ops.link")
+struct bpf_testmod_ops3 testmod_this_ptr = {
+	.test_1 = (void *)test1,
+	.data = 1234,
+};
+
+
diff --git a/tools/testing/selftests/bpf/test_kmods/bpf_testmod.c b/tools/testing/selftests/bpf/test_kmods/bpf_testmod.c
index 2e54b95ad898..f692ee43d25c 100644
--- a/tools/testing/selftests/bpf/test_kmods/bpf_testmod.c
+++ b/tools/testing/selftests/bpf/test_kmods/bpf_testmod.c
@@ -272,9 +272,9 @@ static void bpf_testmod_test_struct_ops3(void)
 		st_ops3->test_1();
 }
 
-__bpf_kfunc void bpf_testmod_ops3_call_test_1(void)
+__bpf_kfunc int bpf_testmod_ops3_call_test_1(void)
 {
-	st_ops3->test_1();
+	return st_ops3->test_1();
 }
 
 __bpf_kfunc void bpf_testmod_ops3_call_test_2(void)
@@ -1057,6 +1057,23 @@ __bpf_kfunc int bpf_kfunc_st_ops_inc10(struct st_ops_args *args)
 	return args->a;
 }
 
+__bpf_kfunc int bpf_kfunc_st_ops_test_this_ptr_impl(void *aux__prog)
+{
+	struct bpf_prog_aux *aux = (struct bpf_prog_aux *)aux__prog;
+	struct bpf_testmod_ops3 *ops;
+	int data = -1;
+
+	rcu_read_lock();
+	ops = rcu_dereference(aux->this_st_ops);
+	if (!ops)
+		goto out;
+
+	data = ops->data;
+out:
+	rcu_read_unlock();
+	return data;
+}
+
 BTF_KFUNCS_START(bpf_testmod_check_kfunc_ids)
 BTF_ID_FLAGS(func, bpf_testmod_test_mod_kfunc)
 BTF_ID_FLAGS(func, bpf_kfunc_call_test1)
@@ -1097,6 +1114,7 @@ BTF_ID_FLAGS(func, bpf_kfunc_st_ops_test_prologue, KF_TRUSTED_ARGS | KF_SLEEPABL
 BTF_ID_FLAGS(func, bpf_kfunc_st_ops_test_epilogue, KF_TRUSTED_ARGS | KF_SLEEPABLE)
 BTF_ID_FLAGS(func, bpf_kfunc_st_ops_test_pro_epilogue, KF_TRUSTED_ARGS | KF_SLEEPABLE)
 BTF_ID_FLAGS(func, bpf_kfunc_st_ops_inc10, KF_TRUSTED_ARGS)
+BTF_ID_FLAGS(func, bpf_kfunc_st_ops_test_this_ptr_impl)
 BTF_KFUNCS_END(bpf_testmod_check_kfunc_ids)
 
 static int bpf_testmod_ops_init(struct btf *btf)
@@ -1269,6 +1287,17 @@ static void test_1_recursion_detected(struct bpf_prog *prog)
 	       u64_stats_read(&stats->misses));
 }
 
+static int st_ops3_init_member(const struct btf_type *t,
+			       const struct btf_member *member,
+			       void *kdata, const void *udata)
+{
+	if (member->offset == offsetof(struct bpf_testmod_ops3, data) * 8) {
+		((struct bpf_testmod_ops3 *)kdata)->data = ((struct bpf_testmod_ops3 *)udata)->data;
+		return 1;
+	}
+	return 0;
+}
+
 static int st_ops3_check_member(const struct btf_type *t,
 				const struct btf_member *member,
 				const struct bpf_prog *prog)
@@ -1289,13 +1318,14 @@ static int st_ops3_check_member(const struct btf_type *t,
 struct bpf_struct_ops bpf_testmod_ops3 = {
 	.verifier_ops = &bpf_testmod_verifier_ops3,
 	.init = bpf_testmod_ops_init,
-	.init_member = bpf_testmod_ops_init_member,
+	.init_member = st_ops3_init_member,
 	.reg = st_ops3_reg,
 	.unreg = st_ops3_unreg,
 	.check_member = st_ops3_check_member,
 	.cfi_stubs = &__bpf_testmod_ops3,
 	.name = "bpf_testmod_ops3",
 	.owner = THIS_MODULE,
+	.flags = BPF_STRUCT_OPS_F_THIS_PTR,
 };
 
 static int bpf_test_mod_st_ops__test_prologue(struct st_ops_args *args)
diff --git a/tools/testing/selftests/bpf/test_kmods/bpf_testmod.h b/tools/testing/selftests/bpf/test_kmods/bpf_testmod.h
index c9fab51f16e2..13581657fe35 100644
--- a/tools/testing/selftests/bpf/test_kmods/bpf_testmod.h
+++ b/tools/testing/selftests/bpf/test_kmods/bpf_testmod.h
@@ -103,6 +103,7 @@ struct bpf_testmod_ops2 {
 struct bpf_testmod_ops3 {
 	int (*test_1)(void);
 	int (*test_2)(void);
+	int data;
 };
 
 struct st_ops_args {
diff --git a/tools/testing/selftests/bpf/test_kmods/bpf_testmod_kfunc.h b/tools/testing/selftests/bpf/test_kmods/bpf_testmod_kfunc.h
index b58817938deb..625b3f4b03f6 100644
--- a/tools/testing/selftests/bpf/test_kmods/bpf_testmod_kfunc.h
+++ b/tools/testing/selftests/bpf/test_kmods/bpf_testmod_kfunc.h
@@ -159,4 +159,7 @@ void bpf_kfunc_trusted_task_test(struct task_struct *ptr) __ksym;
 void bpf_kfunc_trusted_num_test(int *ptr) __ksym;
 void bpf_kfunc_rcu_task_test(struct task_struct *ptr) __ksym;
 
+int bpf_testmod_ops3_call_test_1(void) __ksym;
+int bpf_kfunc_st_ops_test_this_ptr_impl(void *aux__prog) __ksym;
+
 #endif /* _BPF_TESTMOD_KFUNC_H */
-- 
2.47.1





[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