Loading drivers/net/vxlan.c +1 −1 Original line number Diff line number Diff line Loading @@ -600,7 +600,7 @@ static struct sk_buff **vxlan_gro_receive(struct sk_buff **head, struct sk_buff skb_gro_pull(skb, sizeof(*eh)); /* pull inner eth header */ skb_gro_postpull_rcsum(skb, eh, sizeof(*eh)); pp = ptype->callbacks.gro_receive(head, skb); pp = call_gro_receive(ptype->callbacks.gro_receive, head, skb); out_unlock: rcu_read_unlock(); Loading include/linux/netdevice.h +24 −0 Original line number Diff line number Diff line Loading @@ -1916,6 +1916,11 @@ struct napi_gro_cb { /* 7 bit hole */ /* Number of gro_receive callbacks this packet already went through */ u8 recursion_counter:4; /* 1 bit hole */ /* used to support CHECKSUM_COMPLETE for tunneling protocols */ __wsum csum; Loading @@ -1925,6 +1930,25 @@ struct napi_gro_cb { #define NAPI_GRO_CB(skb) ((struct napi_gro_cb *)(skb)->cb) #define GRO_RECURSION_LIMIT 15 static inline int gro_recursion_inc_test(struct sk_buff *skb) { return ++NAPI_GRO_CB(skb)->recursion_counter == GRO_RECURSION_LIMIT; } typedef struct sk_buff **(*gro_receive_t)(struct sk_buff **, struct sk_buff *); static inline struct sk_buff **call_gro_receive(gro_receive_t cb, struct sk_buff **head, struct sk_buff *skb) { if (unlikely(gro_recursion_inc_test(skb))) { NAPI_GRO_CB(skb)->flush |= 1; return NULL; } return cb(head, skb); } struct packet_type { __be16 type; /* This is really htons(ether_type). */ struct net_device *dev; /* NULL is wildcarded here */ Loading net/core/dev.c +1 −0 Original line number Diff line number Diff line Loading @@ -4118,6 +4118,7 @@ static enum gro_result dev_gro_receive(struct napi_struct *napi, struct sk_buff NAPI_GRO_CB(skb)->flush = 0; NAPI_GRO_CB(skb)->free = 0; NAPI_GRO_CB(skb)->encap_mark = 0; NAPI_GRO_CB(skb)->recursion_counter = 0; /* Setup for GRO checksum validation */ switch (skb->ip_summed) { Loading net/ipv4/af_inet.c +1 −1 Original line number Diff line number Diff line Loading @@ -1409,7 +1409,7 @@ static struct sk_buff **inet_gro_receive(struct sk_buff **head, skb_gro_pull(skb, sizeof(*iph)); skb_set_transport_header(skb, skb_gro_offset(skb)); pp = ops->callbacks.gro_receive(head, skb); pp = call_gro_receive(ops->callbacks.gro_receive, head, skb); out_unlock: rcu_read_unlock(); Loading net/ipv4/fou.c +2 −2 Original line number Diff line number Diff line Loading @@ -127,7 +127,7 @@ static struct sk_buff **fou_gro_receive(struct sk_buff **head, if (!ops || !ops->callbacks.gro_receive) goto out_unlock; pp = ops->callbacks.gro_receive(head, skb); pp = call_gro_receive(ops->callbacks.gro_receive, head, skb); out_unlock: rcu_read_unlock(); Loading Loading @@ -236,7 +236,7 @@ static struct sk_buff **gue_gro_receive(struct sk_buff **head, /* Adjusted NAPI_GRO_CB(skb)->csum after skb_gro_pull()*/ skb_gro_postpull_rcsum(skb, guehdr, guehlen); pp = ops->callbacks.gro_receive(head, skb); pp = call_gro_receive(ops->callbacks.gro_receive, head, skb); out_unlock: rcu_read_unlock(); Loading Loading
drivers/net/vxlan.c +1 −1 Original line number Diff line number Diff line Loading @@ -600,7 +600,7 @@ static struct sk_buff **vxlan_gro_receive(struct sk_buff **head, struct sk_buff skb_gro_pull(skb, sizeof(*eh)); /* pull inner eth header */ skb_gro_postpull_rcsum(skb, eh, sizeof(*eh)); pp = ptype->callbacks.gro_receive(head, skb); pp = call_gro_receive(ptype->callbacks.gro_receive, head, skb); out_unlock: rcu_read_unlock(); Loading
include/linux/netdevice.h +24 −0 Original line number Diff line number Diff line Loading @@ -1916,6 +1916,11 @@ struct napi_gro_cb { /* 7 bit hole */ /* Number of gro_receive callbacks this packet already went through */ u8 recursion_counter:4; /* 1 bit hole */ /* used to support CHECKSUM_COMPLETE for tunneling protocols */ __wsum csum; Loading @@ -1925,6 +1930,25 @@ struct napi_gro_cb { #define NAPI_GRO_CB(skb) ((struct napi_gro_cb *)(skb)->cb) #define GRO_RECURSION_LIMIT 15 static inline int gro_recursion_inc_test(struct sk_buff *skb) { return ++NAPI_GRO_CB(skb)->recursion_counter == GRO_RECURSION_LIMIT; } typedef struct sk_buff **(*gro_receive_t)(struct sk_buff **, struct sk_buff *); static inline struct sk_buff **call_gro_receive(gro_receive_t cb, struct sk_buff **head, struct sk_buff *skb) { if (unlikely(gro_recursion_inc_test(skb))) { NAPI_GRO_CB(skb)->flush |= 1; return NULL; } return cb(head, skb); } struct packet_type { __be16 type; /* This is really htons(ether_type). */ struct net_device *dev; /* NULL is wildcarded here */ Loading
net/core/dev.c +1 −0 Original line number Diff line number Diff line Loading @@ -4118,6 +4118,7 @@ static enum gro_result dev_gro_receive(struct napi_struct *napi, struct sk_buff NAPI_GRO_CB(skb)->flush = 0; NAPI_GRO_CB(skb)->free = 0; NAPI_GRO_CB(skb)->encap_mark = 0; NAPI_GRO_CB(skb)->recursion_counter = 0; /* Setup for GRO checksum validation */ switch (skb->ip_summed) { Loading
net/ipv4/af_inet.c +1 −1 Original line number Diff line number Diff line Loading @@ -1409,7 +1409,7 @@ static struct sk_buff **inet_gro_receive(struct sk_buff **head, skb_gro_pull(skb, sizeof(*iph)); skb_set_transport_header(skb, skb_gro_offset(skb)); pp = ops->callbacks.gro_receive(head, skb); pp = call_gro_receive(ops->callbacks.gro_receive, head, skb); out_unlock: rcu_read_unlock(); Loading
net/ipv4/fou.c +2 −2 Original line number Diff line number Diff line Loading @@ -127,7 +127,7 @@ static struct sk_buff **fou_gro_receive(struct sk_buff **head, if (!ops || !ops->callbacks.gro_receive) goto out_unlock; pp = ops->callbacks.gro_receive(head, skb); pp = call_gro_receive(ops->callbacks.gro_receive, head, skb); out_unlock: rcu_read_unlock(); Loading Loading @@ -236,7 +236,7 @@ static struct sk_buff **gue_gro_receive(struct sk_buff **head, /* Adjusted NAPI_GRO_CB(skb)->csum after skb_gro_pull()*/ skb_gro_postpull_rcsum(skb, guehdr, guehlen); pp = ops->callbacks.gro_receive(head, skb); pp = call_gro_receive(ops->callbacks.gro_receive, head, skb); out_unlock: rcu_read_unlock(); Loading