xref: /linux/tools/testing/selftests/bpf/progs/tailcall_bpf2bpf_hierarchy_fentry.c (revision c771600c6af14749609b49565ffb4cac2959710d)
1b83b936fSLeon Hwang // SPDX-License-Identifier: GPL-2.0
2b83b936fSLeon Hwang /* Copyright Leon Hwang */
3b83b936fSLeon Hwang 
4b83b936fSLeon Hwang #include "vmlinux.h"
5b83b936fSLeon Hwang #include <bpf/bpf_helpers.h>
6b83b936fSLeon Hwang #include <bpf/bpf_tracing.h>
7b83b936fSLeon Hwang 
8b83b936fSLeon Hwang struct {
9b83b936fSLeon Hwang 	__uint(type, BPF_MAP_TYPE_PROG_ARRAY);
10b83b936fSLeon Hwang 	__uint(max_entries, 1);
11b83b936fSLeon Hwang 	__uint(key_size, sizeof(__u32));
12b83b936fSLeon Hwang 	__uint(value_size, sizeof(__u32));
13b83b936fSLeon Hwang } jmp_table SEC(".maps");
14b83b936fSLeon Hwang 
15b83b936fSLeon Hwang int count = 0;
16b83b936fSLeon Hwang 
17b83b936fSLeon Hwang static __noinline
subprog_tail(void * ctx)18b83b936fSLeon Hwang int subprog_tail(void *ctx)
19b83b936fSLeon Hwang {
20b83b936fSLeon Hwang 	bpf_tail_call_static(ctx, &jmp_table, 0);
21b83b936fSLeon Hwang 	return 0;
22b83b936fSLeon Hwang }
23b83b936fSLeon Hwang 
24b83b936fSLeon Hwang SEC("fentry/dummy")
BPF_PROG(fentry,struct sk_buff * skb)25b83b936fSLeon Hwang int BPF_PROG(fentry, struct sk_buff *skb)
26b83b936fSLeon Hwang {
27b83b936fSLeon Hwang 	count++;
28b83b936fSLeon Hwang 	subprog_tail(ctx);
29b83b936fSLeon Hwang 	subprog_tail(ctx);
30b83b936fSLeon Hwang 
31b83b936fSLeon Hwang 	return 0;
32b83b936fSLeon Hwang }
33b83b936fSLeon Hwang 
34b83b936fSLeon Hwang 
35b83b936fSLeon Hwang char _license[] SEC("license") = "GPL";
36