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