From: Alexei Starovoitov <ast@xxxxxxxxxx> Add load and run time test for bpf_kfunc_exists() and check that the verifier performs dead code elimination for non-existing kfunc. Signed-off-by: Alexei Starovoitov <ast@xxxxxxxxxx> --- .../selftests/bpf/progs/task_kfunc_success.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/bpf/progs/task_kfunc_success.c b/tools/testing/selftests/bpf/progs/task_kfunc_success.c index 4f61596b0242..c0a7774e0c79 100644 --- a/tools/testing/selftests/bpf/progs/task_kfunc_success.c +++ b/tools/testing/selftests/bpf/progs/task_kfunc_success.c @@ -17,6 +17,8 @@ int err, pid; * TP_PROTO(struct task_struct *p, u64 clone_flags) */ +void invalid_kfunc(void) __ksym __weak; + static bool is_test_kfunc_task(void) { int cur_pid = bpf_get_current_pid_tgid() >> 32; @@ -26,7 +28,17 @@ static bool is_test_kfunc_task(void) static int test_acquire_release(struct task_struct *task) { - struct task_struct *acquired; + struct task_struct *acquired = NULL; + + if (!bpf_kfunc_exists(bpf_task_acquire)) { + err = 3; + return 0; + } + if (bpf_kfunc_exists(invalid_kfunc)) { + /* the verifier's dead code elimination should remove this */ + err = 4; + asm volatile ("goto -1"); /* for (;;); */ + } acquired = bpf_task_acquire(task); bpf_task_release(acquired); -- 2.34.1