OSDN Git Service

net: gro: move skb_gro_receive into net/core/gro.c
authorEric Dumazet <edumazet@google.com>
Mon, 15 Nov 2021 17:05:53 +0000 (09:05 -0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 16 Nov 2021 13:16:54 +0000 (13:16 +0000)
net/core/gro.c will contain all core gro functions,
to shrink net/core/skbuff.c and net/core/dev.c

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/netdevice.h
include/net/gro.h
net/core/Makefile
net/core/gro.c [new file with mode: 0644]
net/core/skbuff.c

index ce6ee14..93d397d 100644 (file)
@@ -2902,7 +2902,6 @@ struct net_device *dev_get_by_index_rcu(struct net *net, int ifindex);
 struct net_device *dev_get_by_napi_id(unsigned int napi_id);
 int netdev_get_name(struct net *net, char *name, int ifindex);
 int dev_restart(struct net_device *dev);
-int skb_gro_receive(struct sk_buff *p, struct sk_buff *skb);
 
 
 static inline int dev_hard_header(struct sk_buff *skb, struct net_device *dev,
index 1ffbe74..f988bf3 100644 (file)
@@ -414,4 +414,6 @@ static inline __wsum ip6_gro_compute_pseudo(struct sk_buff *skb, int proto)
                                            skb_gro_len(skb), proto, 0));
 }
 
+int skb_gro_receive(struct sk_buff *p, struct sk_buff *skb);
+
 #endif /* _NET_IPV6_GRO_H */
index 4268846..6bdcb2c 100644 (file)
@@ -11,7 +11,7 @@ obj-$(CONFIG_SYSCTL) += sysctl_net_core.o
 obj-y               += dev.o dev_addr_lists.o dst.o netevent.o \
                        neighbour.o rtnetlink.o utils.o link_watch.o filter.o \
                        sock_diag.o dev_ioctl.o tso.o sock_reuseport.o \
-                       fib_notifier.o xdp.o flow_offload.o
+                       fib_notifier.o xdp.o flow_offload.o gro.o
 
 obj-y += net-sysfs.o
 obj-$(CONFIG_PAGE_POOL) += page_pool.o
diff --git a/net/core/gro.c b/net/core/gro.c
new file mode 100644 (file)
index 0000000..91a74c4
--- /dev/null
@@ -0,0 +1,118 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include <net/gro.h>
+
+int skb_gro_receive(struct sk_buff *p, struct sk_buff *skb)
+{
+       struct skb_shared_info *pinfo, *skbinfo = skb_shinfo(skb);
+       unsigned int offset = skb_gro_offset(skb);
+       unsigned int headlen = skb_headlen(skb);
+       unsigned int len = skb_gro_len(skb);
+       unsigned int delta_truesize;
+       unsigned int new_truesize;
+       struct sk_buff *lp;
+
+       if (unlikely(p->len + len >= 65536 || NAPI_GRO_CB(skb)->flush))
+               return -E2BIG;
+
+       lp = NAPI_GRO_CB(p)->last;
+       pinfo = skb_shinfo(lp);
+
+       if (headlen <= offset) {
+               skb_frag_t *frag;
+               skb_frag_t *frag2;
+               int i = skbinfo->nr_frags;
+               int nr_frags = pinfo->nr_frags + i;
+
+               if (nr_frags > MAX_SKB_FRAGS)
+                       goto merge;
+
+               offset -= headlen;
+               pinfo->nr_frags = nr_frags;
+               skbinfo->nr_frags = 0;
+
+               frag = pinfo->frags + nr_frags;
+               frag2 = skbinfo->frags + i;
+               do {
+                       *--frag = *--frag2;
+               } while (--i);
+
+               skb_frag_off_add(frag, offset);
+               skb_frag_size_sub(frag, offset);
+
+               /* all fragments truesize : remove (head size + sk_buff) */
+               new_truesize = SKB_TRUESIZE(skb_end_offset(skb));
+               delta_truesize = skb->truesize - new_truesize;
+
+               skb->truesize = new_truesize;
+               skb->len -= skb->data_len;
+               skb->data_len = 0;
+
+               NAPI_GRO_CB(skb)->free = NAPI_GRO_FREE;
+               goto done;
+       } else if (skb->head_frag) {
+               int nr_frags = pinfo->nr_frags;
+               skb_frag_t *frag = pinfo->frags + nr_frags;
+               struct page *page = virt_to_head_page(skb->head);
+               unsigned int first_size = headlen - offset;
+               unsigned int first_offset;
+
+               if (nr_frags + 1 + skbinfo->nr_frags > MAX_SKB_FRAGS)
+                       goto merge;
+
+               first_offset = skb->data -
+                              (unsigned char *)page_address(page) +
+                              offset;
+
+               pinfo->nr_frags = nr_frags + 1 + skbinfo->nr_frags;
+
+               __skb_frag_set_page(frag, page);
+               skb_frag_off_set(frag, first_offset);
+               skb_frag_size_set(frag, first_size);
+
+               memcpy(frag + 1, skbinfo->frags, sizeof(*frag) * skbinfo->nr_frags);
+               /* We dont need to clear skbinfo->nr_frags here */
+
+               new_truesize = SKB_DATA_ALIGN(sizeof(struct sk_buff));
+               delta_truesize = skb->truesize - new_truesize;
+               skb->truesize = new_truesize;
+               NAPI_GRO_CB(skb)->free = NAPI_GRO_FREE_STOLEN_HEAD;
+               goto done;
+       }
+
+merge:
+       /* sk owenrship - if any - completely transferred to the aggregated packet */
+       skb->destructor = NULL;
+       delta_truesize = skb->truesize;
+       if (offset > headlen) {
+               unsigned int eat = offset - headlen;
+
+               skb_frag_off_add(&skbinfo->frags[0], eat);
+               skb_frag_size_sub(&skbinfo->frags[0], eat);
+               skb->data_len -= eat;
+               skb->len -= eat;
+               offset = headlen;
+       }
+
+       __skb_pull(skb, offset);
+
+       if (NAPI_GRO_CB(p)->last == p)
+               skb_shinfo(p)->frag_list = skb;
+       else
+               NAPI_GRO_CB(p)->last->next = skb;
+       NAPI_GRO_CB(p)->last = skb;
+       __skb_header_release(skb);
+       lp = p;
+
+done:
+       NAPI_GRO_CB(p)->count++;
+       p->data_len += len;
+       p->truesize += delta_truesize;
+       p->len += len;
+       if (lp != p) {
+               lp->data_len += len;
+               lp->truesize += delta_truesize;
+               lp->len += len;
+       }
+       NAPI_GRO_CB(skb)->same_flow = 1;
+       return 0;
+}
index 8560d50..73720bc 100644 (file)
@@ -64,7 +64,6 @@
 
 #include <net/protocol.h>
 #include <net/dst.h>
-#include <net/gro.h>
 #include <net/sock.h>
 #include <net/checksum.h>
 #include <net/ip6_checksum.h>
@@ -4272,122 +4271,6 @@ err:
 }
 EXPORT_SYMBOL_GPL(skb_segment);
 
-int skb_gro_receive(struct sk_buff *p, struct sk_buff *skb)
-{
-       struct skb_shared_info *pinfo, *skbinfo = skb_shinfo(skb);
-       unsigned int offset = skb_gro_offset(skb);
-       unsigned int headlen = skb_headlen(skb);
-       unsigned int len = skb_gro_len(skb);
-       unsigned int delta_truesize;
-       unsigned int new_truesize;
-       struct sk_buff *lp;
-
-       if (unlikely(p->len + len >= 65536 || NAPI_GRO_CB(skb)->flush))
-               return -E2BIG;
-
-       lp = NAPI_GRO_CB(p)->last;
-       pinfo = skb_shinfo(lp);
-
-       if (headlen <= offset) {
-               skb_frag_t *frag;
-               skb_frag_t *frag2;
-               int i = skbinfo->nr_frags;
-               int nr_frags = pinfo->nr_frags + i;
-
-               if (nr_frags > MAX_SKB_FRAGS)
-                       goto merge;
-
-               offset -= headlen;
-               pinfo->nr_frags = nr_frags;
-               skbinfo->nr_frags = 0;
-
-               frag = pinfo->frags + nr_frags;
-               frag2 = skbinfo->frags + i;
-               do {
-                       *--frag = *--frag2;
-               } while (--i);
-
-               skb_frag_off_add(frag, offset);
-               skb_frag_size_sub(frag, offset);
-
-               /* all fragments truesize : remove (head size + sk_buff) */
-               new_truesize = SKB_TRUESIZE(skb_end_offset(skb));
-               delta_truesize = skb->truesize - new_truesize;
-
-               skb->truesize = new_truesize;
-               skb->len -= skb->data_len;
-               skb->data_len = 0;
-
-               NAPI_GRO_CB(skb)->free = NAPI_GRO_FREE;
-               goto done;
-       } else if (skb->head_frag) {
-               int nr_frags = pinfo->nr_frags;
-               skb_frag_t *frag = pinfo->frags + nr_frags;
-               struct page *page = virt_to_head_page(skb->head);
-               unsigned int first_size = headlen - offset;
-               unsigned int first_offset;
-
-               if (nr_frags + 1 + skbinfo->nr_frags > MAX_SKB_FRAGS)
-                       goto merge;
-
-               first_offset = skb->data -
-                              (unsigned char *)page_address(page) +
-                              offset;
-
-               pinfo->nr_frags = nr_frags + 1 + skbinfo->nr_frags;
-
-               __skb_frag_set_page(frag, page);
-               skb_frag_off_set(frag, first_offset);
-               skb_frag_size_set(frag, first_size);
-
-               memcpy(frag + 1, skbinfo->frags, sizeof(*frag) * skbinfo->nr_frags);
-               /* We dont need to clear skbinfo->nr_frags here */
-
-               new_truesize = SKB_DATA_ALIGN(sizeof(struct sk_buff));
-               delta_truesize = skb->truesize - new_truesize;
-               skb->truesize = new_truesize;
-               NAPI_GRO_CB(skb)->free = NAPI_GRO_FREE_STOLEN_HEAD;
-               goto done;
-       }
-
-merge:
-       /* sk owenrship - if any - completely transferred to the aggregated packet */
-       skb->destructor = NULL;
-       delta_truesize = skb->truesize;
-       if (offset > headlen) {
-               unsigned int eat = offset - headlen;
-
-               skb_frag_off_add(&skbinfo->frags[0], eat);
-               skb_frag_size_sub(&skbinfo->frags[0], eat);
-               skb->data_len -= eat;
-               skb->len -= eat;
-               offset = headlen;
-       }
-
-       __skb_pull(skb, offset);
-
-       if (NAPI_GRO_CB(p)->last == p)
-               skb_shinfo(p)->frag_list = skb;
-       else
-               NAPI_GRO_CB(p)->last->next = skb;
-       NAPI_GRO_CB(p)->last = skb;
-       __skb_header_release(skb);
-       lp = p;
-
-done:
-       NAPI_GRO_CB(p)->count++;
-       p->data_len += len;
-       p->truesize += delta_truesize;
-       p->len += len;
-       if (lp != p) {
-               lp->data_len += len;
-               lp->truesize += delta_truesize;
-               lp->len += len;
-       }
-       NAPI_GRO_CB(skb)->same_flow = 1;
-       return 0;
-}
-
 #ifdef CONFIG_SKB_EXTENSIONS
 #define SKB_EXT_ALIGN_VALUE    8
 #define SKB_EXT_CHUNKSIZEOF(x) (ALIGN((sizeof(x)), SKB_EXT_ALIGN_VALUE) / SKB_EXT_ALIGN_VALUE)