xref: /linux/tools/testing/selftests/bpf/progs/timer_interrupt.c (revision 88a3bde432b8263660793bce84910dd44f46ef25)
1*88a3bde4SLeon Hwang // SPDX-License-Identifier: GPL-2.0
2*88a3bde4SLeon Hwang #include <vmlinux.h>
3*88a3bde4SLeon Hwang #include <bpf/bpf_helpers.h>
4*88a3bde4SLeon Hwang #include <bpf/bpf_tracing.h>
5*88a3bde4SLeon Hwang #include "bpf_experimental.h"
6*88a3bde4SLeon Hwang 
7*88a3bde4SLeon Hwang char _license[] SEC("license") = "GPL";
8*88a3bde4SLeon Hwang 
9*88a3bde4SLeon Hwang #define CLOCK_MONOTONIC		1
10*88a3bde4SLeon Hwang 
11*88a3bde4SLeon Hwang int preempt_count;
12*88a3bde4SLeon Hwang int in_interrupt;
13*88a3bde4SLeon Hwang int in_interrupt_cb;
14*88a3bde4SLeon Hwang 
15*88a3bde4SLeon Hwang struct elem {
16*88a3bde4SLeon Hwang 	struct bpf_timer t;
17*88a3bde4SLeon Hwang };
18*88a3bde4SLeon Hwang 
19*88a3bde4SLeon Hwang struct {
20*88a3bde4SLeon Hwang 	__uint(type, BPF_MAP_TYPE_ARRAY);
21*88a3bde4SLeon Hwang 	__uint(max_entries, 1);
22*88a3bde4SLeon Hwang 	__type(key, int);
23*88a3bde4SLeon Hwang 	__type(value, struct elem);
24*88a3bde4SLeon Hwang } array SEC(".maps");
25*88a3bde4SLeon Hwang 
26*88a3bde4SLeon Hwang static int timer_in_interrupt(void *map, int *key, struct bpf_timer *timer)
27*88a3bde4SLeon Hwang {
28*88a3bde4SLeon Hwang 	preempt_count = get_preempt_count();
29*88a3bde4SLeon Hwang 	in_interrupt_cb = bpf_in_interrupt();
30*88a3bde4SLeon Hwang 	return 0;
31*88a3bde4SLeon Hwang }
32*88a3bde4SLeon Hwang 
33*88a3bde4SLeon Hwang SEC("fentry/bpf_fentry_test1")
34*88a3bde4SLeon Hwang int BPF_PROG(test_timer_interrupt)
35*88a3bde4SLeon Hwang {
36*88a3bde4SLeon Hwang 	struct bpf_timer *timer;
37*88a3bde4SLeon Hwang 	int key = 0;
38*88a3bde4SLeon Hwang 
39*88a3bde4SLeon Hwang 	timer = bpf_map_lookup_elem(&array, &key);
40*88a3bde4SLeon Hwang 	if (!timer)
41*88a3bde4SLeon Hwang 		return 0;
42*88a3bde4SLeon Hwang 
43*88a3bde4SLeon Hwang 	in_interrupt = bpf_in_interrupt();
44*88a3bde4SLeon Hwang 	bpf_timer_init(timer, &array, CLOCK_MONOTONIC);
45*88a3bde4SLeon Hwang 	bpf_timer_set_callback(timer, timer_in_interrupt);
46*88a3bde4SLeon Hwang 	bpf_timer_start(timer, 0, 0);
47*88a3bde4SLeon Hwang 	return 0;
48*88a3bde4SLeon Hwang }
49