net: skbuff: don't include <net/page_pool/types.h> to <linux/skbuff.h>
authorAlexander Lobakin <aleksander.lobakin@intel.com>
Fri, 4 Aug 2023 18:05:25 +0000 (20:05 +0200)
committerJakub Kicinski <kuba@kernel.org>
Mon, 7 Aug 2023 20:05:53 +0000 (13:05 -0700)
Currently, touching <net/page_pool/types.h> triggers a rebuild of more
than half of the kernel. That's because it's included in
<linux/skbuff.h>. And each new include to page_pool/types.h adds more
[useless] data for the toolchain to process per each source file from
that pile.

In commit 6a5bcd84e886 ("page_pool: Allow drivers to hint on SKB
recycling"), Matteo included it to be able to call a couple of functions
defined there. Then, in commit 57f05bc2ab24 ("page_pool: keep pp info as
long as page pool owns the page") one of the calls was removed, so only
one was left. It's the call to page_pool_return_skb_page() in
napi_frag_unref(). The function is external and doesn't have any
dependencies. Having very niche page_pool_types.h included only for that
looks like an overkill.

As %PP_SIGNATURE is not local to page_pool.c (was only in the
early submissions), nothing holds this function there. Teleport
page_pool_return_skb_page() to skbuff.c, just next to the main consumer,
skb_pp_recycle(), and rename it to napi_pp_put_page(), as it doesn't
work with skbs at all and the former name tells nothing. The #if guards
here are only to not compile and have it in the vmlinux when not needed
-- both call sites are already guarded.
Now, touching page_pool_types.h only triggers rebuilding of the drivers
using it and a couple of core networking files.

Suggested-by: Jakub Kicinski <kuba@kernel.org> # make skbuff.h less heavy
Suggested-by: Alexander Duyck <alexanderduyck@fb.com> # move to skbuff.c
Signed-off-by: Alexander Lobakin <aleksander.lobakin@intel.com>
Reviewed-by: Alexander Duyck <alexanderduyck@fb.com>
Link: https://lore.kernel.org/r/20230804180529.2483231-3-aleksander.lobakin@intel.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/linux/skbuff.h
include/net/page_pool/types.h
net/core/page_pool.c
net/core/skbuff.c

index 888e3d7..aa57e2e 100644 (file)
@@ -32,7 +32,6 @@
 #include <linux/if_packet.h>
 #include <linux/llist.h>
 #include <net/flow.h>
-#include <net/page_pool/types.h>
 #if IS_ENABLED(CONFIG_NF_CONNTRACK)
 #include <linux/netfilter/nf_conntrack_common.h>
 #endif
@@ -3421,13 +3420,15 @@ static inline void skb_frag_ref(struct sk_buff *skb, int f)
        __skb_frag_ref(&skb_shinfo(skb)->frags[f]);
 }
 
+bool napi_pp_put_page(struct page *page, bool napi_safe);
+
 static inline void
 napi_frag_unref(skb_frag_t *frag, bool recycle, bool napi_safe)
 {
        struct page *page = skb_frag_page(frag);
 
 #ifdef CONFIG_PAGE_POOL
-       if (recycle && page_pool_return_skb_page(page, napi_safe))
+       if (recycle && napi_pp_put_page(page, napi_safe))
                return;
 #endif
        put_page(page);
index 9ac3919..fcb8465 100644 (file)
@@ -185,8 +185,6 @@ struct page_pool {
 struct page *page_pool_alloc_pages(struct page_pool *pool, gfp_t gfp);
 struct page *page_pool_alloc_frag(struct page_pool *pool, unsigned int *offset,
                                  unsigned int size, gfp_t gfp);
-bool page_pool_return_skb_page(struct page *page, bool napi_safe);
-
 struct page_pool *page_pool_create(const struct page_pool_params *params);
 
 struct xdp_mem_info;
index cd28c1f..03ad74d 100644 (file)
@@ -935,42 +935,3 @@ void page_pool_update_nid(struct page_pool *pool, int new_nid)
        }
 }
 EXPORT_SYMBOL(page_pool_update_nid);
-
-bool page_pool_return_skb_page(struct page *page, bool napi_safe)
-{
-       struct napi_struct *napi;
-       struct page_pool *pp;
-       bool allow_direct;
-
-       page = compound_head(page);
-
-       /* page->pp_magic is OR'ed with PP_SIGNATURE after the allocation
-        * in order to preserve any existing bits, such as bit 0 for the
-        * head page of compound page and bit 1 for pfmemalloc page, so
-        * mask those bits for freeing side when doing below checking,
-        * and page_is_pfmemalloc() is checked in __page_pool_put_page()
-        * to avoid recycling the pfmemalloc page.
-        */
-       if (unlikely((page->pp_magic & ~0x3UL) != PP_SIGNATURE))
-               return false;
-
-       pp = page->pp;
-
-       /* Allow direct recycle if we have reasons to believe that we are
-        * in the same context as the consumer would run, so there's
-        * no possible race.
-        */
-       napi = READ_ONCE(pp->p.napi);
-       allow_direct = napi_safe && napi &&
-               READ_ONCE(napi->list_owner) == smp_processor_id();
-
-       /* Driver set this to memory recycling info. Reset it on recycle.
-        * This will *not* work for NIC using a split-page memory model.
-        * The page will be returned to the pool here regardless of the
-        * 'flipped' fragment being in use or not.
-        */
-       page_pool_put_full_page(pp, page, allow_direct);
-
-       return true;
-}
-EXPORT_SYMBOL(page_pool_return_skb_page);
index d3bed96..acc5844 100644 (file)
@@ -73,7 +73,7 @@
 #include <net/mpls.h>
 #include <net/mptcp.h>
 #include <net/mctp.h>
-#include <net/page_pool/types.h>
+#include <net/page_pool/helpers.h>
 #include <net/dropreason.h>
 
 #include <linux/uaccess.h>
@@ -879,11 +879,52 @@ static void skb_clone_fraglist(struct sk_buff *skb)
                skb_get(list);
 }
 
+#if IS_ENABLED(CONFIG_PAGE_POOL)
+bool napi_pp_put_page(struct page *page, bool napi_safe)
+{
+       struct napi_struct *napi;
+       struct page_pool *pp;
+       bool allow_direct;
+
+       page = compound_head(page);
+
+       /* page->pp_magic is OR'ed with PP_SIGNATURE after the allocation
+        * in order to preserve any existing bits, such as bit 0 for the
+        * head page of compound page and bit 1 for pfmemalloc page, so
+        * mask those bits for freeing side when doing below checking,
+        * and page_is_pfmemalloc() is checked in __page_pool_put_page()
+        * to avoid recycling the pfmemalloc page.
+        */
+       if (unlikely((page->pp_magic & ~0x3UL) != PP_SIGNATURE))
+               return false;
+
+       pp = page->pp;
+
+       /* Allow direct recycle if we have reasons to believe that we are
+        * in the same context as the consumer would run, so there's
+        * no possible race.
+        */
+       napi = READ_ONCE(pp->p.napi);
+       allow_direct = napi_safe && napi &&
+               READ_ONCE(napi->list_owner) == smp_processor_id();
+
+       /* Driver set this to memory recycling info. Reset it on recycle.
+        * This will *not* work for NIC using a split-page memory model.
+        * The page will be returned to the pool here regardless of the
+        * 'flipped' fragment being in use or not.
+        */
+       page_pool_put_full_page(pp, page, allow_direct);
+
+       return true;
+}
+EXPORT_SYMBOL(napi_pp_put_page);
+#endif
+
 static bool skb_pp_recycle(struct sk_buff *skb, void *data, bool napi_safe)
 {
        if (!IS_ENABLED(CONFIG_PAGE_POOL) || !skb->pp_recycle)
                return false;
-       return page_pool_return_skb_page(virt_to_page(data), napi_safe);
+       return napi_pp_put_page(virt_to_page(data), napi_safe);
 }
 
 static void skb_kfree_head(void *head, unsigned int end_offset)