bpf, selftests: Use bpf_tail_call_static where appropriate
authorDaniel Borkmann <daniel@iogearbox.net>
Wed, 30 Sep 2020 15:18:19 +0000 (17:18 +0200)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 30 Sep 2020 18:50:35 +0000 (11:50 -0700)
For those locations where we use an immediate tail call map index use the
newly added bpf_tail_call_static() helper.

Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Martin KaFai Lau <kafai@fb.com>
Link: https://lore.kernel.org/bpf/3cfb2b799a62d22c6e7ae5897c23940bdcc24cbc.1601477936.git.daniel@iogearbox.net
samples/bpf/sockex3_kern.c
tools/testing/selftests/bpf/progs/bpf_flow.c
tools/testing/selftests/bpf/progs/tailcall1.c
tools/testing/selftests/bpf/progs/tailcall2.c
tools/testing/selftests/bpf/progs/tailcall3.c
tools/testing/selftests/bpf/progs/tailcall_bpf2bpf1.c
tools/testing/selftests/bpf/progs/tailcall_bpf2bpf2.c
tools/testing/selftests/bpf/progs/tailcall_bpf2bpf3.c
tools/testing/selftests/bpf/progs/tailcall_bpf2bpf4.c

index cab9cca..8142d02 100644 (file)
@@ -31,28 +31,30 @@ struct {
 #define PARSE_IP 3
 #define PARSE_IPV6 4
 
-/* protocol dispatch routine.
- * It tail-calls next BPF program depending on eth proto
- * Note, we could have used:
- * bpf_tail_call(skb, &jmp_table, proto);
- * but it would need large prog_array
+/* Protocol dispatch routine. It tail-calls next BPF program depending
+ * on eth proto. Note, we could have used ...
+ *
+ *   bpf_tail_call(skb, &jmp_table, proto);
+ *
+ * ... but it would need large prog_array and cannot be optimised given
+ * the map key is not static.
  */
 static inline void parse_eth_proto(struct __sk_buff *skb, u32 proto)
 {
        switch (proto) {
        case ETH_P_8021Q:
        case ETH_P_8021AD:
-               bpf_tail_call(skb, &jmp_table, PARSE_VLAN);
+               bpf_tail_call_static(skb, &jmp_table, PARSE_VLAN);
                break;
        case ETH_P_MPLS_UC:
        case ETH_P_MPLS_MC:
-               bpf_tail_call(skb, &jmp_table, PARSE_MPLS);
+               bpf_tail_call_static(skb, &jmp_table, PARSE_MPLS);
                break;
        case ETH_P_IP:
-               bpf_tail_call(skb, &jmp_table, PARSE_IP);
+               bpf_tail_call_static(skb, &jmp_table, PARSE_IP);
                break;
        case ETH_P_IPV6:
-               bpf_tail_call(skb, &jmp_table, PARSE_IPV6);
+               bpf_tail_call_static(skb, &jmp_table, PARSE_IPV6);
                break;
        }
 }
index de6de92..5a65f6b 100644 (file)
@@ -118,18 +118,18 @@ static __always_inline int parse_eth_proto(struct __sk_buff *skb, __be16 proto)
 
        switch (proto) {
        case bpf_htons(ETH_P_IP):
-               bpf_tail_call(skb, &jmp_table, IP);
+               bpf_tail_call_static(skb, &jmp_table, IP);
                break;
        case bpf_htons(ETH_P_IPV6):
-               bpf_tail_call(skb, &jmp_table, IPV6);
+               bpf_tail_call_static(skb, &jmp_table, IPV6);
                break;
        case bpf_htons(ETH_P_MPLS_MC):
        case bpf_htons(ETH_P_MPLS_UC):
-               bpf_tail_call(skb, &jmp_table, MPLS);
+               bpf_tail_call_static(skb, &jmp_table, MPLS);
                break;
        case bpf_htons(ETH_P_8021Q):
        case bpf_htons(ETH_P_8021AD):
-               bpf_tail_call(skb, &jmp_table, VLAN);
+               bpf_tail_call_static(skb, &jmp_table, VLAN);
                break;
        default:
                /* Protocol not supported */
@@ -246,10 +246,10 @@ static __always_inline int parse_ipv6_proto(struct __sk_buff *skb, __u8 nexthdr)
        switch (nexthdr) {
        case IPPROTO_HOPOPTS:
        case IPPROTO_DSTOPTS:
-               bpf_tail_call(skb, &jmp_table, IPV6OP);
+               bpf_tail_call_static(skb, &jmp_table, IPV6OP);
                break;
        case IPPROTO_FRAGMENT:
-               bpf_tail_call(skb, &jmp_table, IPV6FR);
+               bpf_tail_call_static(skb, &jmp_table, IPV6FR);
                break;
        default:
                return parse_ip_proto(skb, nexthdr);
index 1f407e6..7115bce 100644 (file)
@@ -26,20 +26,20 @@ int entry(struct __sk_buff *skb)
        /* Multiple locations to make sure we patch
         * all of them.
         */
-       bpf_tail_call(skb, &jmp_table, 0);
-       bpf_tail_call(skb, &jmp_table, 0);
-       bpf_tail_call(skb, &jmp_table, 0);
-       bpf_tail_call(skb, &jmp_table, 0);
-
-       bpf_tail_call(skb, &jmp_table, 1);
-       bpf_tail_call(skb, &jmp_table, 1);
-       bpf_tail_call(skb, &jmp_table, 1);
-       bpf_tail_call(skb, &jmp_table, 1);
-
-       bpf_tail_call(skb, &jmp_table, 2);
-       bpf_tail_call(skb, &jmp_table, 2);
-       bpf_tail_call(skb, &jmp_table, 2);
-       bpf_tail_call(skb, &jmp_table, 2);
+       bpf_tail_call_static(skb, &jmp_table, 0);
+       bpf_tail_call_static(skb, &jmp_table, 0);
+       bpf_tail_call_static(skb, &jmp_table, 0);
+       bpf_tail_call_static(skb, &jmp_table, 0);
+
+       bpf_tail_call_static(skb, &jmp_table, 1);
+       bpf_tail_call_static(skb, &jmp_table, 1);
+       bpf_tail_call_static(skb, &jmp_table, 1);
+       bpf_tail_call_static(skb, &jmp_table, 1);
+
+       bpf_tail_call_static(skb, &jmp_table, 2);
+       bpf_tail_call_static(skb, &jmp_table, 2);
+       bpf_tail_call_static(skb, &jmp_table, 2);
+       bpf_tail_call_static(skb, &jmp_table, 2);
 
        return 3;
 }
index a093e73..0431e4f 100644 (file)
@@ -13,14 +13,14 @@ struct {
 SEC("classifier/0")
 int bpf_func_0(struct __sk_buff *skb)
 {
-       bpf_tail_call(skb, &jmp_table, 1);
+       bpf_tail_call_static(skb, &jmp_table, 1);
        return 0;
 }
 
 SEC("classifier/1")
 int bpf_func_1(struct __sk_buff *skb)
 {
-       bpf_tail_call(skb, &jmp_table, 2);
+       bpf_tail_call_static(skb, &jmp_table, 2);
        return 1;
 }
 
@@ -33,25 +33,25 @@ int bpf_func_2(struct __sk_buff *skb)
 SEC("classifier/3")
 int bpf_func_3(struct __sk_buff *skb)
 {
-       bpf_tail_call(skb, &jmp_table, 4);
+       bpf_tail_call_static(skb, &jmp_table, 4);
        return 3;
 }
 
 SEC("classifier/4")
 int bpf_func_4(struct __sk_buff *skb)
 {
-       bpf_tail_call(skb, &jmp_table, 3);
+       bpf_tail_call_static(skb, &jmp_table, 3);
        return 4;
 }
 
 SEC("classifier")
 int entry(struct __sk_buff *skb)
 {
-       bpf_tail_call(skb, &jmp_table, 0);
+       bpf_tail_call_static(skb, &jmp_table, 0);
        /* Check multi-prog update. */
-       bpf_tail_call(skb, &jmp_table, 2);
+       bpf_tail_call_static(skb, &jmp_table, 2);
        /* Check tail call limit. */
-       bpf_tail_call(skb, &jmp_table, 3);
+       bpf_tail_call_static(skb, &jmp_table, 3);
        return 3;
 }
 
index cabda87..739dc2a 100644 (file)
@@ -16,14 +16,14 @@ SEC("classifier/0")
 int bpf_func_0(struct __sk_buff *skb)
 {
        count++;
-       bpf_tail_call(skb, &jmp_table, 0);
+       bpf_tail_call_static(skb, &jmp_table, 0);
        return 1;
 }
 
 SEC("classifier")
 int entry(struct __sk_buff *skb)
 {
-       bpf_tail_call(skb, &jmp_table, 0);
+       bpf_tail_call_static(skb, &jmp_table, 0);
        return 0;
 }
 
index b5d9c8e..0103f3d 100644 (file)
@@ -21,7 +21,7 @@ TAIL_FUNC(1)
 static __noinline
 int subprog_tail(struct __sk_buff *skb)
 {
-       bpf_tail_call(skb, &jmp_table, 0);
+       bpf_tail_call_static(skb, &jmp_table, 0);
 
        return skb->len * 2;
 }
@@ -29,7 +29,7 @@ int subprog_tail(struct __sk_buff *skb)
 SEC("classifier")
 int entry(struct __sk_buff *skb)
 {
-       bpf_tail_call(skb, &jmp_table, 1);
+       bpf_tail_call_static(skb, &jmp_table, 1);
 
        return subprog_tail(skb);
 }
index a004ab2..7b1c041 100644 (file)
@@ -14,9 +14,9 @@ static __noinline
 int subprog_tail(struct __sk_buff *skb)
 {
        if (load_byte(skb, 0))
-               bpf_tail_call(skb, &jmp_table, 1);
+               bpf_tail_call_static(skb, &jmp_table, 1);
        else
-               bpf_tail_call(skb, &jmp_table, 0);
+               bpf_tail_call_static(skb, &jmp_table, 0);
        return 1;
 }
 
@@ -32,7 +32,7 @@ int bpf_func_0(struct __sk_buff *skb)
 SEC("classifier")
 int entry(struct __sk_buff *skb)
 {
-       bpf_tail_call(skb, &jmp_table, 0);
+       bpf_tail_call_static(skb, &jmp_table, 0);
 
        return 0;
 }
index 96dbef2..0d5482b 100644 (file)
@@ -16,9 +16,9 @@ int subprog_tail2(struct __sk_buff *skb)
        volatile char arr[64] = {};
 
        if (load_word(skb, 0) || load_half(skb, 0))
-               bpf_tail_call(skb, &jmp_table, 10);
+               bpf_tail_call_static(skb, &jmp_table, 10);
        else
-               bpf_tail_call(skb, &jmp_table, 1);
+               bpf_tail_call_static(skb, &jmp_table, 1);
 
        return skb->len;
 }
@@ -28,7 +28,7 @@ int subprog_tail(struct __sk_buff *skb)
 {
        volatile char arr[64] = {};
 
-       bpf_tail_call(skb, &jmp_table, 0);
+       bpf_tail_call_static(skb, &jmp_table, 0);
 
        return skb->len * 2;
 }
index 98b40a9..9a1b166 100644 (file)
@@ -14,21 +14,21 @@ static volatile int count;
 __noinline
 int subprog_tail_2(struct __sk_buff *skb)
 {
-       bpf_tail_call(skb, &jmp_table, 2);
+       bpf_tail_call_static(skb, &jmp_table, 2);
        return skb->len * 3;
 }
 
 __noinline
 int subprog_tail_1(struct __sk_buff *skb)
 {
-       bpf_tail_call(skb, &jmp_table, 1);
+       bpf_tail_call_static(skb, &jmp_table, 1);
        return skb->len * 2;
 }
 
 __noinline
 int subprog_tail(struct __sk_buff *skb)
 {
-       bpf_tail_call(skb, &jmp_table, 0);
+       bpf_tail_call_static(skb, &jmp_table, 0);
        return skb->len;
 }