xref: /linux/tools/testing/selftests/bpf/progs/test_ctx.c (revision c17ee635fd3a482b2ad2bf5e269755c2eae5f25e)
1*221b5e76SChangwoo Min // SPDX-License-Identifier: GPL-2.0
2*221b5e76SChangwoo Min /*
3*221b5e76SChangwoo Min  * Copyright (c) 2026 Valve Corporation.
4*221b5e76SChangwoo Min  * Author: Changwoo Min <changwoo@igalia.com>
5*221b5e76SChangwoo Min  */
6*221b5e76SChangwoo Min 
7*221b5e76SChangwoo Min #include "vmlinux.h"
8*221b5e76SChangwoo Min #include <bpf/bpf_helpers.h>
9*221b5e76SChangwoo Min #include <bpf/bpf_tracing.h>
10*221b5e76SChangwoo Min #include "bpf_experimental.h"
11*221b5e76SChangwoo Min 
12*221b5e76SChangwoo Min char _license[] SEC("license") = "GPL";
13*221b5e76SChangwoo Min 
14*221b5e76SChangwoo Min extern void bpf_kfunc_trigger_ctx_check(void) __ksym;
15*221b5e76SChangwoo Min 
16*221b5e76SChangwoo Min int count_hardirq;
17*221b5e76SChangwoo Min int count_softirq;
18*221b5e76SChangwoo Min int count_task;
19*221b5e76SChangwoo Min 
20*221b5e76SChangwoo Min /* Triggered via bpf_prog_test_run from user-space */
21*221b5e76SChangwoo Min SEC("syscall")
22*221b5e76SChangwoo Min int trigger_all_contexts(void *ctx)
23*221b5e76SChangwoo Min {
24*221b5e76SChangwoo Min 	if (bpf_in_task())
25*221b5e76SChangwoo Min 		__sync_fetch_and_add(&count_task, 1);
26*221b5e76SChangwoo Min 
27*221b5e76SChangwoo Min 	/* Trigger the firing of a hardirq and softirq for test. */
28*221b5e76SChangwoo Min 	bpf_kfunc_trigger_ctx_check();
29*221b5e76SChangwoo Min 	return 0;
30*221b5e76SChangwoo Min }
31*221b5e76SChangwoo Min 
32*221b5e76SChangwoo Min /* Observer for HardIRQ */
33*221b5e76SChangwoo Min SEC("fentry/bpf_testmod_test_hardirq_fn")
34*221b5e76SChangwoo Min int BPF_PROG(on_hardirq)
35*221b5e76SChangwoo Min {
36*221b5e76SChangwoo Min 	if (bpf_in_hardirq())
37*221b5e76SChangwoo Min 		__sync_fetch_and_add(&count_hardirq, 1);
38*221b5e76SChangwoo Min 	return 0;
39*221b5e76SChangwoo Min }
40*221b5e76SChangwoo Min 
41*221b5e76SChangwoo Min /* Observer for SoftIRQ */
42*221b5e76SChangwoo Min SEC("fentry/bpf_testmod_test_softirq_fn")
43*221b5e76SChangwoo Min int BPF_PROG(on_softirq)
44*221b5e76SChangwoo Min {
45*221b5e76SChangwoo Min 	if (bpf_in_serving_softirq())
46*221b5e76SChangwoo Min 		__sync_fetch_and_add(&count_softirq, 1);
47*221b5e76SChangwoo Min 	return 0;
48*221b5e76SChangwoo Min }
49