On Wed, Sep 02, 2020 at 10:08:15PM +0200, Maciej Fijalkowski wrote: > diff --git a/tools/testing/selftests/bpf/progs/tailcall6.c b/tools/testing/selftests/bpf/progs/tailcall6.c > new file mode 100644 > index 000000000000..e72ca5869b58 > --- /dev/null > +++ b/tools/testing/selftests/bpf/progs/tailcall6.c > @@ -0,0 +1,38 @@ > +// SPDX-License-Identifier: GPL-2.0 > +#include <linux/bpf.h> > +#include <bpf/bpf_helpers.h> > + > +struct { > + __uint(type, BPF_MAP_TYPE_PROG_ARRAY); > + __uint(max_entries, 2); > + __uint(key_size, sizeof(__u32)); > + __uint(value_size, sizeof(__u32)); > +} jmp_table SEC(".maps"); > + > +#define TAIL_FUNC(x) \ > + SEC("classifier/" #x) \ > + int bpf_func_##x(struct __sk_buff *skb) \ > + { \ > + return x; \ > + } > +TAIL_FUNC(0) > +TAIL_FUNC(1) > + > +static __attribute__ ((noinline)) > +int subprog_tail(struct __sk_buff *skb) > +{ > + bpf_tail_call(skb, &jmp_table, 0); > + > + return skb->len * 2; > +} > + > +SEC("classifier") > +int entry(struct __sk_buff *skb) > +{ > + bpf_tail_call(skb, &jmp_table, 1); > + > + return subprog_tail(skb); > +} Could you add few more tests to exercise the new feature more thoroughly? Something like tailcall3.c that checks 32 limit, but doing tail_call from subprog. And another test that consume non-trival amount of stack in each function. Adding 'volatile char arr[128] = {};' would do the trick.