diff options
author | Alexander Lobakin <alobakin@pm.me> | 2021-03-18 18:42:30 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2021-03-18 19:51:12 -0700 |
commit | 86af2c82c28499b4b509d6b15637a96bd829201b (patch) | |
tree | 2b18b57281cfc421c6f7ca302314a17a5a55670c | |
parent | e75ec151c1088c1aa7a49ff16a2adcaddb24a861 (diff) | |
download | linux-86af2c82c28499b4b509d6b15637a96bd829201b.tar.gz linux-86af2c82c28499b4b509d6b15637a96bd829201b.tar.bz2 linux-86af2c82c28499b4b509d6b15637a96bd829201b.zip |
gro: add combined call_gro_receive() + INDIRECT_CALL_INET() helper
call_gro_receive() is used to limit GRO recursion, but it works only
with callback pointers.
There's a combined version of call_gro_receive() + INDIRECT_CALL_2()
in <net/inet_common.h>, but it doesn't check for IPv6 modularity.
Add a similar new helper to cover both of these. It can and will be
used to avoid retpoline overhead when IP header lies behind another
offloaded proto.
Signed-off-by: Alexander Lobakin <alobakin@pm.me>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | include/net/gro.h | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/include/net/gro.h b/include/net/gro.h index 27c38b36df16..01edaf3fdda0 100644 --- a/include/net/gro.h +++ b/include/net/gro.h @@ -14,4 +14,12 @@ INDIRECT_CALLABLE_DECLARE(int ipv6_gro_complete(struct sk_buff *, int)); INDIRECT_CALLABLE_DECLARE(struct sk_buff *inet_gro_receive(struct list_head *, struct sk_buff *)); INDIRECT_CALLABLE_DECLARE(int inet_gro_complete(struct sk_buff *, int)); + +#define indirect_call_gro_receive_inet(cb, f2, f1, head, skb) \ +({ \ + unlikely(gro_recursion_inc_test(skb)) ? \ + NAPI_GRO_CB(skb)->flush |= 1, NULL : \ + INDIRECT_CALL_INET(cb, f2, f1, head, skb); \ +}) + #endif /* _NET_IPV6_GRO_H */ |