Add selftests for the newly introduced context detection kfuncs. The tests verify that each kfunc correctly identifies its respective execution context by triggering different contexts Signed-off-by: Jiayuan Chen --- .../selftests/bpf/prog_tests/context.c | 32 ++++++++++++++++++ .../selftests/bpf/progs/context_prog.c | 33 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 tools/testing/selftests/bpf/prog_tests/context.c create mode 100644 tools/testing/selftests/bpf/progs/context_prog.c diff --git a/tools/testing/selftests/bpf/prog_tests/context.c b/tools/testing/selftests/bpf/prog_tests/context.c new file mode 100644 index 000000000000..f09d24069941 --- /dev/null +++ b/tools/testing/selftests/bpf/prog_tests/context.c @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include "context_prog.skel.h" + +void test_context(void) +{ + struct context_prog *skel = NULL; + + skel = context_prog__open_and_load(); + if (!ASSERT_OK_PTR(skel, "loading prog fail")) + return; + + context_prog__attach(skel); + getuid(); + sleep(5); + + if (!ASSERT_EQ(1, skel->bss->in_hardirq, "hardirq not triggered")) + goto out; + if (!ASSERT_EQ(1, skel->bss->in_softriq, "softirq not triggered")) + goto out; + if (!ASSERT_EQ(1, skel->bss->in_task, "task context not triggered")) + goto out; +out: + context_prog__destroy(skel); +} + +void test_bpf_context(void) +{ + if (test__start_subtest("context")) + test_context(); +} diff --git a/tools/testing/selftests/bpf/progs/context_prog.c b/tools/testing/selftests/bpf/progs/context_prog.c new file mode 100644 index 000000000000..81e21f684a84 --- /dev/null +++ b/tools/testing/selftests/bpf/progs/context_prog.c @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include "bpf_misc.h" +#include "bpf_experimental.h" + +int in_hardirq = 0; +int in_softriq = 0; +int in_task = 0; + +SEC("tp/irq/irq_handler_entry") +int trace_irq_handler_entry(const void *ctx) +{ + in_hardirq = bpf_in_hardirq_context(); + return 0; +} + +SEC("tp/irq/softirq_entry") +int trace_softirq_entry(const void *ctx) +{ + in_softriq = bpf_in_softirq_context(); + return 0; +} + +SEC("tp/syscalls/sys_enter_getuid") +int trace_syscall(const void *ctx) +{ + in_task = bpf_in_task_context(); + return 0; +} + +char _license[] SEC("license") = "GPL"; -- 2.43.0