mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-13 22:56:27 +08:00
net: skbuff: don't include <net/page_pool/types.h> to <linux/skbuff.h>
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 commit6a5bcd84e8
("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 commit57f05bc2ab
("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>
This commit is contained in:
parent
a9ca9f9cef
commit
75eaf63ea7
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user