mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

This adds some extra noise to the tailcall_bpf2bpf4 tests that will cause verify to patch insns. This then moves around subprog start/end insn index and poke descriptor insn index to ensure that verify and JIT will continue to track these correctly. If done correctly verifier should pass this program same as before and JIT should emit tail call logic. Signed-off-by: John Fastabend <john.fastabend@gmail.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Link: https://lore.kernel.org/bpf/20210707223848.14580-3-john.fastabend@gmail.com
79 lines
1.4 KiB
C
79 lines
1.4 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
#include <linux/bpf.h>
|
|
#include <bpf/bpf_helpers.h>
|
|
|
|
struct {
|
|
__uint(type, BPF_MAP_TYPE_ARRAY);
|
|
__uint(max_entries, 1);
|
|
__uint(key_size, sizeof(__u32));
|
|
__uint(value_size, sizeof(__u32));
|
|
} nop_table SEC(".maps");
|
|
|
|
struct {
|
|
__uint(type, BPF_MAP_TYPE_PROG_ARRAY);
|
|
__uint(max_entries, 3);
|
|
__uint(key_size, sizeof(__u32));
|
|
__uint(value_size, sizeof(__u32));
|
|
} jmp_table SEC(".maps");
|
|
|
|
int count = 0;
|
|
int noise = 0;
|
|
|
|
__always_inline int subprog_noise(void)
|
|
{
|
|
__u32 key = 0;
|
|
|
|
bpf_map_lookup_elem(&nop_table, &key);
|
|
return 0;
|
|
}
|
|
|
|
__noinline
|
|
int subprog_tail_2(struct __sk_buff *skb)
|
|
{
|
|
if (noise)
|
|
subprog_noise();
|
|
bpf_tail_call_static(skb, &jmp_table, 2);
|
|
return skb->len * 3;
|
|
}
|
|
|
|
__noinline
|
|
int subprog_tail_1(struct __sk_buff *skb)
|
|
{
|
|
bpf_tail_call_static(skb, &jmp_table, 1);
|
|
return skb->len * 2;
|
|
}
|
|
|
|
__noinline
|
|
int subprog_tail(struct __sk_buff *skb)
|
|
{
|
|
bpf_tail_call_static(skb, &jmp_table, 0);
|
|
return skb->len;
|
|
}
|
|
|
|
SEC("classifier/1")
|
|
int bpf_func_1(struct __sk_buff *skb)
|
|
{
|
|
return subprog_tail_2(skb);
|
|
}
|
|
|
|
SEC("classifier/2")
|
|
int bpf_func_2(struct __sk_buff *skb)
|
|
{
|
|
count++;
|
|
return subprog_tail_2(skb);
|
|
}
|
|
|
|
SEC("classifier/0")
|
|
int bpf_func_0(struct __sk_buff *skb)
|
|
{
|
|
return subprog_tail_1(skb);
|
|
}
|
|
|
|
SEC("classifier")
|
|
int entry(struct __sk_buff *skb)
|
|
{
|
|
return subprog_tail(skb);
|
|
}
|
|
|
|
char __license[] SEC("license") = "GPL";
|
|
int _version SEC("version") = 1;
|