OSDN Git Service

sk_buff: introduce 'slow_gro' flags
authorPaolo Abeni <pabeni@redhat.com>
Wed, 28 Jul 2021 16:23:59 +0000 (18:23 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 29 Jul 2021 11:18:11 +0000 (12:18 +0100)
The new flag tracks if any state field is set, so that
GRO requires 'unusual'/slow prepare steps.

Set such flag when a ct entry is attached to the skb,
and never clear it.

The new bit uses an existing hole into the sk_buff struct

RFC -> v1:
 - use a single state bit, never clear it
 - avoid moving the _nfct field

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/skbuff.h

index f191908..3ff1830 100644 (file)
@@ -689,6 +689,7 @@ typedef unsigned char *sk_buff_data_t;
  *             CHECKSUM_UNNECESSARY (max 3)
  *     @dst_pending_confirm: need to confirm neighbour
  *     @decrypted: Decrypted SKB
+ *     @slow_gro: state present at GRO time, slower prepare step required
  *     @napi_id: id of the NAPI struct this skb came from
  *     @sender_cpu: (aka @napi_id) source CPU in XPS
  *     @secmark: security marking
@@ -870,6 +871,7 @@ struct sk_buff {
 #ifdef CONFIG_TLS_DEVICE
        __u8                    decrypted:1;
 #endif
+       __u8                    slow_gro:1;
 
 #ifdef CONFIG_NET_SCHED
        __u16                   tc_index;       /* traffic control index */
@@ -4216,6 +4218,7 @@ static inline unsigned long skb_get_nfct(const struct sk_buff *skb)
 static inline void skb_set_nfct(struct sk_buff *skb, unsigned long nfct)
 {
 #if IS_ENABLED(CONFIG_NF_CONNTRACK)
+       skb->slow_gro |= !!nfct;
        skb->_nfct = nfct;
 #endif
 }
@@ -4375,6 +4378,7 @@ static inline void nf_copy(struct sk_buff *dst, const struct sk_buff *src)
 #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
        nf_conntrack_put(skb_nfct(dst));
 #endif
+       dst->slow_gro = src->slow_gro;
        __nf_copy(dst, src, true);
 }