xref: /linux/tools/testing/selftests/bpf/progs/tailcall_sleepable.c (revision c17ee635fd3a482b2ad2bf5e269755c2eae5f25e)
1*15ac1adfSJiri Olsa // SPDX-License-Identifier: GPL-2.0
2*15ac1adfSJiri Olsa #include <linux/bpf.h>
3*15ac1adfSJiri Olsa #include <bpf/bpf_helpers.h>
4*15ac1adfSJiri Olsa #include "bpf_misc.h"
5*15ac1adfSJiri Olsa #include "bpf_test_utils.h"
6*15ac1adfSJiri Olsa 
7*15ac1adfSJiri Olsa struct {
8*15ac1adfSJiri Olsa 	__uint(type, BPF_MAP_TYPE_PROG_ARRAY);
9*15ac1adfSJiri Olsa 	__uint(max_entries, 1);
10*15ac1adfSJiri Olsa 	__uint(key_size, sizeof(__u32));
11*15ac1adfSJiri Olsa 	__array(values, void (void));
12*15ac1adfSJiri Olsa } jmp_table SEC(".maps");
13*15ac1adfSJiri Olsa 
14*15ac1adfSJiri Olsa SEC("?uprobe")
15*15ac1adfSJiri Olsa int uprobe_normal(void *ctx)
16*15ac1adfSJiri Olsa {
17*15ac1adfSJiri Olsa 	bpf_tail_call_static(ctx, &jmp_table, 0);
18*15ac1adfSJiri Olsa 	return 0;
19*15ac1adfSJiri Olsa }
20*15ac1adfSJiri Olsa 
21*15ac1adfSJiri Olsa SEC("?uprobe.s")
22*15ac1adfSJiri Olsa int uprobe_sleepable_1(void *ctx)
23*15ac1adfSJiri Olsa {
24*15ac1adfSJiri Olsa 	bpf_tail_call_static(ctx, &jmp_table, 0);
25*15ac1adfSJiri Olsa 	return 0;
26*15ac1adfSJiri Olsa }
27*15ac1adfSJiri Olsa 
28*15ac1adfSJiri Olsa int executed = 0;
29*15ac1adfSJiri Olsa int my_pid = 0;
30*15ac1adfSJiri Olsa 
31*15ac1adfSJiri Olsa SEC("?uprobe.s")
32*15ac1adfSJiri Olsa int uprobe_sleepable_2(void *ctx)
33*15ac1adfSJiri Olsa {
34*15ac1adfSJiri Olsa 	int pid = bpf_get_current_pid_tgid() >> 32;
35*15ac1adfSJiri Olsa 
36*15ac1adfSJiri Olsa 	if (pid != my_pid)
37*15ac1adfSJiri Olsa 		return 0;
38*15ac1adfSJiri Olsa 
39*15ac1adfSJiri Olsa 	executed++;
40*15ac1adfSJiri Olsa 	return 0;
41*15ac1adfSJiri Olsa }
42*15ac1adfSJiri Olsa 
43*15ac1adfSJiri Olsa char __license[] SEC("license") = "GPL";
44