diff mbox series

[net-next,v3,06/12] net: skbuff: don't include <net/page_pool.h> into <linux/skbuff.h>

Message ID 20230530150035.1943669-7-aleksander.lobakin@intel.com (mailing list archive)
State Changes Requested
Delegated to: Netdev Maintainers
Headers show
Series net: intel: start The Great Code Dedup + Page Pool for iavf | expand

Checks

Context Check Description
netdev/series_format success Posting correctly formatted
netdev/tree_selection success Clearly marked for net-next, async
netdev/fixes_present success Fixes tag not required for -next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 5156 this patch: 5156
netdev/cc_maintainers warning 30 maintainers not CCed: daniel@iogearbox.net tariqt@nvidia.com linux-imx@nxp.com sean.wang@mediatek.com angelogioacchino.delregno@collabora.com sgoutham@marvell.com gerhard@engleder-embedded.com saeedm@nvidia.com wei.fang@nxp.com john.fastabend@gmail.com imagedong@tencent.com linux-wireless@vger.kernel.org leon@kernel.org ast@kernel.org linux-rdma@vger.kernel.org xiaoning.wang@nxp.com nbd@nbd.name shayne.chen@mediatek.com bpf@vger.kernel.org linux-mediatek@lists.infradead.org gakula@marvell.com shenwei.wang@nxp.com kvalo@kernel.org matthias.bgg@gmail.com ryder.lee@mediatek.com sbhatta@marvell.com linux-arm-kernel@lists.infradead.org lorenzo@kernel.org maxtram95@gmail.com hkelam@marvell.com
netdev/build_clang success Errors and warnings before: 1977 this patch: 1977
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 5387 this patch: 5387
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 73 lines checked
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Alexander Lobakin May 30, 2023, 3 p.m. UTC
Currently, touching <net/page_pool.h> triggers a rebuild of more than
a half of the kernel. That's because it's included in <linux/skbuff.h>.

In 6a5bcd84e886 ("page_pool: Allow drivers to hint on SKB recycling"),
Matteo included it to be able to call a couple functions defined there.
Then, in 57f05bc2ab24 ("page_pool: keep pp info as long as page pool
owns the page") one of the calls was removed, so only one left.
It's call to page_pool_return_skb_page() in napi_frag_unref(). The
function is external and doesn't have any dependencies. Having include
of very niche page_pool.h only for that looks like an overkill.
Instead, move the declaration of that function to skbuff.h itself, with
a small comment that it's a special guest and should not be touched.
Now, after a few include fixes in the drivers, touching page_pool.h
only triggers rebuilding of the drivers using it and a couple core
networking files.

Signed-off-by: Alexander Lobakin <aleksander.lobakin@intel.com>
---
 drivers/net/ethernet/engleder/tsnep_main.c               | 1 +
 drivers/net/ethernet/freescale/fec_main.c                | 1 +
 drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c | 1 +
 drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c     | 1 +
 drivers/net/ethernet/mellanox/mlx5/core/en/params.c      | 1 +
 drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c         | 1 +
 drivers/net/wireless/mediatek/mt76/mt76.h                | 1 +
 include/linux/skbuff.h                                   | 4 +++-
 include/net/page_pool.h                                  | 2 --
 9 files changed, 10 insertions(+), 3 deletions(-)

Comments

Alexander Duyck May 31, 2023, 3:21 p.m. UTC | #1
On Tue, 2023-05-30 at 17:00 +0200, Alexander Lobakin wrote:
> Currently, touching <net/page_pool.h> triggers a rebuild of more than
> a half of the kernel. That's because it's included in <linux/skbuff.h>.
> 
> In 6a5bcd84e886 ("page_pool: Allow drivers to hint on SKB recycling"),
> Matteo included it to be able to call a couple functions defined there.
> Then, in 57f05bc2ab24 ("page_pool: keep pp info as long as page pool
> owns the page") one of the calls was removed, so only one left.
> It's call to page_pool_return_skb_page() in napi_frag_unref(). The
> function is external and doesn't have any dependencies. Having include
> of very niche page_pool.h only for that looks like an overkill.
> Instead, move the declaration of that function to skbuff.h itself, with
> a small comment that it's a special guest and should not be touched.
> Now, after a few include fixes in the drivers, touching page_pool.h
> only triggers rebuilding of the drivers using it and a couple core
> networking files.
> 
> Signed-off-by: Alexander Lobakin <aleksander.lobakin@intel.com>
> ---
>  drivers/net/ethernet/engleder/tsnep_main.c               | 1 +
>  drivers/net/ethernet/freescale/fec_main.c                | 1 +
>  drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c | 1 +
>  drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c     | 1 +
>  drivers/net/ethernet/mellanox/mlx5/core/en/params.c      | 1 +
>  drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c         | 1 +
>  drivers/net/wireless/mediatek/mt76/mt76.h                | 1 +
>  include/linux/skbuff.h                                   | 4 +++-
>  include/net/page_pool.h                                  | 2 --
>  9 files changed, 10 insertions(+), 3 deletions(-)
> 
> 

<...>

> diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
> index 5951904413ab..6d5eee932b95 100644
> --- a/include/linux/skbuff.h
> +++ b/include/linux/skbuff.h
> @@ -32,7 +32,6 @@
>  #include <linux/if_packet.h>
>  #include <linux/llist.h>
>  #include <net/flow.h>
> -#include <net/page_pool.h>
>  #if IS_ENABLED(CONFIG_NF_CONNTRACK)
>  #include <linux/netfilter/nf_conntrack_common.h>
>  #endif
> @@ -3422,6 +3421,9 @@ static inline void skb_frag_ref(struct sk_buff *skb, int f)
>  	__skb_frag_ref(&skb_shinfo(skb)->frags[f]);
>  }
>  
> +/* Internal from net/core/page_pool.c, do not use in drivers directly */
> +bool page_pool_return_skb_page(struct page *page, bool napi_safe);
> +
>  static inline void
>  napi_frag_unref(skb_frag_t *frag, bool recycle, bool napi_safe)
>  {
> diff --git a/include/net/page_pool.h b/include/net/page_pool.h
> index 126f9e294389..2a9ce2aa6eb2 100644
> --- a/include/net/page_pool.h
> +++ b/include/net/page_pool.h
> @@ -240,8 +240,6 @@ inline enum dma_data_direction page_pool_get_dma_dir(struct page_pool *pool)
>  	return pool->p.dma_dir;
>  }
>  
> -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;

So the code as-is works, so I am providing my "Reviewed-by".
Reviewed-by: Alexander Duyck <alexanderduyck@fb.com>

Consider the rest of this a suggestion or a "nice to have".

I wonder if we shouldn't also look at restructuring the function and
just moving it to net/core/skbuff.c somewhere next to skb_pp_recycle.

I suspect we could look at pulling parts of it out as well. The
pp_magic check should always be succeeding unless we have pages getting
routed the wrong way somewhere. So maybe we should look at pulling it
out and moving it to another part of the path such as
__page_pool_put_page() and making it a bit more visible to catch those
cases.
Alexander Lobakin May 31, 2023, 3:28 p.m. UTC | #2
From: Alexander H Duyck <alexander.duyck@gmail.com>
Date: Wed, 31 May 2023 08:21:03 -0700

> On Tue, 2023-05-30 at 17:00 +0200, Alexander Lobakin wrote:
>> Currently, touching <net/page_pool.h> triggers a rebuild of more than
>> a half of the kernel. That's because it's included in <linux/skbuff.h>.
>>
>> In 6a5bcd84e886 ("page_pool: Allow drivers to hint on SKB recycling"),
>> Matteo included it to be able to call a couple functions defined there.
>> Then, in 57f05bc2ab24 ("page_pool: keep pp info as long as page pool
>> owns the page") one of the calls was removed, so only one left.
>> It's call to page_pool_return_skb_page() in napi_frag_unref(). The
>> function is external and doesn't have any dependencies. Having include
>> of very niche page_pool.h only for that looks like an overkill.
>> Instead, move the declaration of that function to skbuff.h itself, with
>> a small comment that it's a special guest and should not be touched.
>> Now, after a few include fixes in the drivers, touching page_pool.h
>> only triggers rebuilding of the drivers using it and a couple core
>> networking files.
>>
>> Signed-off-by: Alexander Lobakin <aleksander.lobakin@intel.com>
>> ---
>>  drivers/net/ethernet/engleder/tsnep_main.c               | 1 +
>>  drivers/net/ethernet/freescale/fec_main.c                | 1 +
>>  drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c | 1 +
>>  drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c     | 1 +
>>  drivers/net/ethernet/mellanox/mlx5/core/en/params.c      | 1 +
>>  drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c         | 1 +
>>  drivers/net/wireless/mediatek/mt76/mt76.h                | 1 +
>>  include/linux/skbuff.h                                   | 4 +++-
>>  include/net/page_pool.h                                  | 2 --
>>  9 files changed, 10 insertions(+), 3 deletions(-)
>>
>>
> 
> <...>
> 
>> diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
>> index 5951904413ab..6d5eee932b95 100644
>> --- a/include/linux/skbuff.h
>> +++ b/include/linux/skbuff.h
>> @@ -32,7 +32,6 @@
>>  #include <linux/if_packet.h>
>>  #include <linux/llist.h>
>>  #include <net/flow.h>
>> -#include <net/page_pool.h>
>>  #if IS_ENABLED(CONFIG_NF_CONNTRACK)
>>  #include <linux/netfilter/nf_conntrack_common.h>
>>  #endif
>> @@ -3422,6 +3421,9 @@ static inline void skb_frag_ref(struct sk_buff *skb, int f)
>>  	__skb_frag_ref(&skb_shinfo(skb)->frags[f]);
>>  }
>>  
>> +/* Internal from net/core/page_pool.c, do not use in drivers directly */
>> +bool page_pool_return_skb_page(struct page *page, bool napi_safe);
>> +
>>  static inline void
>>  napi_frag_unref(skb_frag_t *frag, bool recycle, bool napi_safe)
>>  {
>> diff --git a/include/net/page_pool.h b/include/net/page_pool.h
>> index 126f9e294389..2a9ce2aa6eb2 100644
>> --- a/include/net/page_pool.h
>> +++ b/include/net/page_pool.h
>> @@ -240,8 +240,6 @@ inline enum dma_data_direction page_pool_get_dma_dir(struct page_pool *pool)
>>  	return pool->p.dma_dir;
>>  }
>>  
>> -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;
> 
> So the code as-is works, so I am providing my "Reviewed-by".
> Reviewed-by: Alexander Duyck <alexanderduyck@fb.com>
> 
> Consider the rest of this a suggestion or a "nice to have".
> 
> I wonder if we shouldn't also look at restructuring the function and
> just moving it to net/core/skbuff.c somewhere next to skb_pp_recycle.
> 
> I suspect we could look at pulling parts of it out as well. The
> pp_magic check should always be succeeding unless we have pages getting
> routed the wrong way somewhere. So maybe we should look at pulling it
> out and moving it to another part of the path such as
> __page_pool_put_page() and making it a bit more visible to catch those
> cases.

I've just noticed that this function is exported with no modular users ._.
Anyway, I feel like it's a good way to go. The entire function, apart
from the magic check, can be moved and made static. And the magic can be
moved one level up, right...
v4 will happen either way I guess, so maybe I'll replace this patch with
that kinda change.

Thanks,
Olek
Alexander Lobakin May 31, 2023, 3:29 p.m. UTC | #3
From: Alexander Lobakin <aleksander.lobakin@intel.com>
Date: Wed, 31 May 2023 17:28:30 +0200

> From: Alexander H Duyck <alexander.duyck@gmail.com>
> Date: Wed, 31 May 2023 08:21:03 -0700
> 
>> On Tue, 2023-05-30 at 17:00 +0200, Alexander Lobakin wrote:
>>> Currently, touching <net/page_pool.h> triggers a rebuild of more than
>>> a half of the kernel. That's because it's included in <linux/skbuff.h>.
>>>
>>> In 6a5bcd84e886 ("page_pool: Allow drivers to hint on SKB recycling"),
>>> Matteo included it to be able to call a couple functions defined there.
>>> Then, in 57f05bc2ab24 ("page_pool: keep pp info as long as page pool
>>> owns the page") one of the calls was removed, so only one left.
>>> It's call to page_pool_return_skb_page() in napi_frag_unref(). The
>>> function is external and doesn't have any dependencies. Having include
>>> of very niche page_pool.h only for that looks like an overkill.
>>> Instead, move the declaration of that function to skbuff.h itself, with
>>> a small comment that it's a special guest and should not be touched.
>>> Now, after a few include fixes in the drivers, touching page_pool.h
>>> only triggers rebuilding of the drivers using it and a couple core
>>> networking files.
>>>
>>> Signed-off-by: Alexander Lobakin <aleksander.lobakin@intel.com>
>>> ---
>>>  drivers/net/ethernet/engleder/tsnep_main.c               | 1 +
>>>  drivers/net/ethernet/freescale/fec_main.c                | 1 +
>>>  drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c | 1 +
>>>  drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c     | 1 +
>>>  drivers/net/ethernet/mellanox/mlx5/core/en/params.c      | 1 +
>>>  drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c         | 1 +
>>>  drivers/net/wireless/mediatek/mt76/mt76.h                | 1 +
>>>  include/linux/skbuff.h                                   | 4 +++-
>>>  include/net/page_pool.h                                  | 2 --
>>>  9 files changed, 10 insertions(+), 3 deletions(-)
>>>
>>>
>>
>> <...>
>>
>>> diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
>>> index 5951904413ab..6d5eee932b95 100644
>>> --- a/include/linux/skbuff.h
>>> +++ b/include/linux/skbuff.h
>>> @@ -32,7 +32,6 @@
>>>  #include <linux/if_packet.h>
>>>  #include <linux/llist.h>
>>>  #include <net/flow.h>
>>> -#include <net/page_pool.h>
>>>  #if IS_ENABLED(CONFIG_NF_CONNTRACK)
>>>  #include <linux/netfilter/nf_conntrack_common.h>
>>>  #endif
>>> @@ -3422,6 +3421,9 @@ static inline void skb_frag_ref(struct sk_buff *skb, int f)
>>>  	__skb_frag_ref(&skb_shinfo(skb)->frags[f]);
>>>  }
>>>  
>>> +/* Internal from net/core/page_pool.c, do not use in drivers directly */
>>> +bool page_pool_return_skb_page(struct page *page, bool napi_safe);
>>> +
>>>  static inline void
>>>  napi_frag_unref(skb_frag_t *frag, bool recycle, bool napi_safe)
>>>  {
>>> diff --git a/include/net/page_pool.h b/include/net/page_pool.h
>>> index 126f9e294389..2a9ce2aa6eb2 100644
>>> --- a/include/net/page_pool.h
>>> +++ b/include/net/page_pool.h
>>> @@ -240,8 +240,6 @@ inline enum dma_data_direction page_pool_get_dma_dir(struct page_pool *pool)
>>>  	return pool->p.dma_dir;
>>>  }
>>>  
>>> -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;
>>
>> So the code as-is works, so I am providing my "Reviewed-by".
>> Reviewed-by: Alexander Duyck <alexanderduyck@fb.com>
>>
>> Consider the rest of this a suggestion or a "nice to have".
>>
>> I wonder if we shouldn't also look at restructuring the function and
>> just moving it to net/core/skbuff.c somewhere next to skb_pp_recycle.
>>
>> I suspect we could look at pulling parts of it out as well. The
>> pp_magic check should always be succeeding unless we have pages getting
>> routed the wrong way somewhere. So maybe we should look at pulling it
>> out and moving it to another part of the path such as
>> __page_pool_put_page() and making it a bit more visible to catch those
>> cases.
> 
> I've just noticed that this function is exported with no modular users ._.

^^^ pls ignore this nonsense lol

> Anyway, I feel like it's a good way to go. The entire function, apart
> from the magic check, can be moved and made static. And the magic can be
> moved one level up, right...
> v4 will happen either way I guess, so maybe I'll replace this patch with
> that kinda change.
> 
> Thanks,
> Olek
diff mbox series

Patch

diff --git a/drivers/net/ethernet/engleder/tsnep_main.c b/drivers/net/ethernet/engleder/tsnep_main.c
index 84751bb303a6..6222aaa5157f 100644
--- a/drivers/net/ethernet/engleder/tsnep_main.c
+++ b/drivers/net/ethernet/engleder/tsnep_main.c
@@ -28,6 +28,7 @@ 
 #include <linux/iopoll.h>
 #include <linux/bpf.h>
 #include <linux/bpf_trace.h>
+#include <net/page_pool.h>
 #include <net/xdp_sock_drv.h>
 
 #define TSNEP_RX_OFFSET (max(NET_SKB_PAD, XDP_PACKET_HEADROOM) + NET_IP_ALIGN)
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index 632bb4d589d7..0731af62d7dd 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -38,6 +38,7 @@ 
 #include <linux/in.h>
 #include <linux/ip.h>
 #include <net/ip.h>
+#include <net/page_pool.h>
 #include <net/selftests.h>
 #include <net/tso.h>
 #include <linux/tcp.h>
diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
index a79cb680bb23..22cb3973f977 100644
--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
@@ -7,6 +7,7 @@ 
 
 #include <linux/interrupt.h>
 #include <linux/pci.h>
+#include <net/page_pool.h>
 #include <net/tso.h>
 
 #include "otx2_reg.h"
diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c
index db3fcab1c8cd..93f0c8e3ce91 100644
--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c
+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c
@@ -16,6 +16,7 @@ 
 #include <linux/bpf.h>
 #include <linux/bpf_trace.h>
 #include <linux/bitfield.h>
+#include <net/page_pool.h>
 
 #include "otx2_reg.h"
 #include "otx2_common.h"
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/params.c b/drivers/net/ethernet/mellanox/mlx5/core/en/params.c
index 9c94807097cb..3235a3a4ed08 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/params.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/params.c
@@ -6,6 +6,7 @@ 
 #include "en/port.h"
 #include "en_accel/en_accel.h"
 #include "en_accel/ipsec.h"
+#include <net/page_pool.h>
 #include <net/xdp_sock_drv.h>
 
 static u8 mlx5e_mpwrq_min_page_shift(struct mlx5_core_dev *mdev)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
index f0e6095809fa..1bd91bc09eb8 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
@@ -35,6 +35,7 @@ 
 #include "en/xdp.h"
 #include "en/params.h"
 #include <linux/bitfield.h>
+#include <net/page_pool.h>
 
 int mlx5e_xdp_max_mtu(struct mlx5e_params *params, struct mlx5e_xsk_param *xsk)
 {
diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
index 6b07b8fafec2..95c16f11d156 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
@@ -15,6 +15,7 @@ 
 #include <linux/average.h>
 #include <linux/soc/mediatek/mtk_wed.h>
 #include <net/mac80211.h>
+#include <net/page_pool.h>
 #include "util.h"
 #include "testmode.h"
 
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 5951904413ab..6d5eee932b95 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -32,7 +32,6 @@ 
 #include <linux/if_packet.h>
 #include <linux/llist.h>
 #include <net/flow.h>
-#include <net/page_pool.h>
 #if IS_ENABLED(CONFIG_NF_CONNTRACK)
 #include <linux/netfilter/nf_conntrack_common.h>
 #endif
@@ -3422,6 +3421,9 @@  static inline void skb_frag_ref(struct sk_buff *skb, int f)
 	__skb_frag_ref(&skb_shinfo(skb)->frags[f]);
 }
 
+/* Internal from net/core/page_pool.c, do not use in drivers directly */
+bool page_pool_return_skb_page(struct page *page, bool napi_safe);
+
 static inline void
 napi_frag_unref(skb_frag_t *frag, bool recycle, bool napi_safe)
 {
diff --git a/include/net/page_pool.h b/include/net/page_pool.h
index 126f9e294389..2a9ce2aa6eb2 100644
--- a/include/net/page_pool.h
+++ b/include/net/page_pool.h
@@ -240,8 +240,6 @@  inline enum dma_data_direction page_pool_get_dma_dir(struct page_pool *pool)
 	return pool->p.dma_dir;
 }
 
-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;