* [RFC net-next] net: page_pool: fix recycle stats for percpu page_pool allocator
@ 2024-02-14 18:08 Lorenzo Bianconi
2024-02-14 21:42 ` Toke Høiland-Jørgensen
2024-02-15 13:41 ` Alexander Lobakin
0 siblings, 2 replies; 7+ messages in thread
From: Lorenzo Bianconi @ 2024-02-14 18:08 UTC (permalink / raw)
To: netdev
Cc: lorenzo.bianconi, kuba, davem, edumazet, pabeni, hawk,
ilias.apalodimas, linyunsheng, toke
Use global page_pool_recycle_stats percpu counter for percpu page_pool
allocator.
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
net/core/page_pool.c | 18 +++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)
diff --git a/net/core/page_pool.c b/net/core/page_pool.c
index 6e0753e6a95b..1bb83b6e7a61 100644
--- a/net/core/page_pool.c
+++ b/net/core/page_pool.c
@@ -31,6 +31,8 @@
#define BIAS_MAX (LONG_MAX >> 1)
#ifdef CONFIG_PAGE_POOL_STATS
+static DEFINE_PER_CPU(struct page_pool_recycle_stats, pp_recycle_stats);
+
/* alloc_stat_inc is intended to be used in softirq context */
#define alloc_stat_inc(pool, __stat) (pool->alloc_stats.__stat++)
/* recycle_stat_inc is safe to use when preemption is possible. */
@@ -220,14 +222,19 @@ static int page_pool_init(struct page_pool *pool,
pool->has_init_callback = !!pool->slow.init_callback;
#ifdef CONFIG_PAGE_POOL_STATS
- pool->recycle_stats = alloc_percpu(struct page_pool_recycle_stats);
- if (!pool->recycle_stats)
- return -ENOMEM;
+ if (cpuid < 0) {
+ pool->recycle_stats = alloc_percpu(struct page_pool_recycle_stats);
+ if (!pool->recycle_stats)
+ return -ENOMEM;
+ } else {
+ pool->recycle_stats = &pp_recycle_stats;
+ }
#endif
if (ptr_ring_init(&pool->ring, ring_qsize, GFP_KERNEL) < 0) {
#ifdef CONFIG_PAGE_POOL_STATS
- free_percpu(pool->recycle_stats);
+ if (cpuid < 0)
+ free_percpu(pool->recycle_stats);
#endif
return -ENOMEM;
}
@@ -251,7 +258,8 @@ static void page_pool_uninit(struct page_pool *pool)
put_device(pool->p.dev);
#ifdef CONFIG_PAGE_POOL_STATS
- free_percpu(pool->recycle_stats);
+ if (pool->cpuid < 0)
+ free_percpu(pool->recycle_stats);
#endif
}
--
2.43.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [RFC net-next] net: page_pool: fix recycle stats for percpu page_pool allocator
2024-02-14 18:08 [RFC net-next] net: page_pool: fix recycle stats for percpu page_pool allocator Lorenzo Bianconi
@ 2024-02-14 21:42 ` Toke Høiland-Jørgensen
2024-02-14 22:46 ` Lorenzo Bianconi
2024-02-15 13:41 ` Alexander Lobakin
1 sibling, 1 reply; 7+ messages in thread
From: Toke Høiland-Jørgensen @ 2024-02-14 21:42 UTC (permalink / raw)
To: Lorenzo Bianconi, netdev
Cc: lorenzo.bianconi, kuba, davem, edumazet, pabeni, hawk,
ilias.apalodimas, linyunsheng
Lorenzo Bianconi <lorenzo@kernel.org> writes:
> Use global page_pool_recycle_stats percpu counter for percpu page_pool
> allocator.
>
> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Neat trick with just referencing the pointer to the global object inside
the page_pool. With just a few nits below:
Reviewed-by: Toke Høiland-Jørgensen <toke@redhat.com>
> ---
> net/core/page_pool.c | 18 +++++++++++++-----
> 1 file changed, 13 insertions(+), 5 deletions(-)
>
> diff --git a/net/core/page_pool.c b/net/core/page_pool.c
> index 6e0753e6a95b..1bb83b6e7a61 100644
> --- a/net/core/page_pool.c
> +++ b/net/core/page_pool.c
> @@ -31,6 +31,8 @@
> #define BIAS_MAX (LONG_MAX >> 1)
>
> #ifdef CONFIG_PAGE_POOL_STATS
> +static DEFINE_PER_CPU(struct page_pool_recycle_stats, pp_recycle_stats);
Should we call this pp_system_recycle_stats to be consistent with the
naming of the other global variable?
> /* alloc_stat_inc is intended to be used in softirq context */
> #define alloc_stat_inc(pool, __stat) (pool->alloc_stats.__stat++)
> /* recycle_stat_inc is safe to use when preemption is possible. */
> @@ -220,14 +222,19 @@ static int page_pool_init(struct page_pool *pool,
> pool->has_init_callback = !!pool->slow.init_callback;
>
> #ifdef CONFIG_PAGE_POOL_STATS
> - pool->recycle_stats = alloc_percpu(struct page_pool_recycle_stats);
> - if (!pool->recycle_stats)
> - return -ENOMEM;
> + if (cpuid < 0) {
> + pool->recycle_stats = alloc_percpu(struct page_pool_recycle_stats);
> + if (!pool->recycle_stats)
> + return -ENOMEM;
> + } else {
Maybe add a short comment here to explain what's going on? Something
like:
/* When a cpuid is supplied, we're initialising the percpu system page pool
* instance, so use a singular stats object instead of allocating a
* separate percpu variable for each (also percpu) page pool instance.
*/
-Toke
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [RFC net-next] net: page_pool: fix recycle stats for percpu page_pool allocator
2024-02-14 21:42 ` Toke Høiland-Jørgensen
@ 2024-02-14 22:46 ` Lorenzo Bianconi
0 siblings, 0 replies; 7+ messages in thread
From: Lorenzo Bianconi @ 2024-02-14 22:46 UTC (permalink / raw)
To: Toke Høiland-Jørgensen
Cc: netdev, lorenzo.bianconi, kuba, davem, edumazet, pabeni, hawk,
ilias.apalodimas, linyunsheng
[-- Attachment #1: Type: text/plain, Size: 2098 bytes --]
> Lorenzo Bianconi <lorenzo@kernel.org> writes:
>
> > Use global page_pool_recycle_stats percpu counter for percpu page_pool
> > allocator.
> >
> > Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
>
> Neat trick with just referencing the pointer to the global object inside
> the page_pool. With just a few nits below:
>
> Reviewed-by: Toke Høiland-Jørgensen <toke@redhat.com>
>
> > ---
> > net/core/page_pool.c | 18 +++++++++++++-----
> > 1 file changed, 13 insertions(+), 5 deletions(-)
> >
> > diff --git a/net/core/page_pool.c b/net/core/page_pool.c
> > index 6e0753e6a95b..1bb83b6e7a61 100644
> > --- a/net/core/page_pool.c
> > +++ b/net/core/page_pool.c
> > @@ -31,6 +31,8 @@
> > #define BIAS_MAX (LONG_MAX >> 1)
> >
> > #ifdef CONFIG_PAGE_POOL_STATS
> > +static DEFINE_PER_CPU(struct page_pool_recycle_stats, pp_recycle_stats);
>
> Should we call this pp_system_recycle_stats to be consistent with the
> naming of the other global variable?
ack, I agree.
>
> > /* alloc_stat_inc is intended to be used in softirq context */
> > #define alloc_stat_inc(pool, __stat) (pool->alloc_stats.__stat++)
> > /* recycle_stat_inc is safe to use when preemption is possible. */
> > @@ -220,14 +222,19 @@ static int page_pool_init(struct page_pool *pool,
> > pool->has_init_callback = !!pool->slow.init_callback;
> >
> > #ifdef CONFIG_PAGE_POOL_STATS
> > - pool->recycle_stats = alloc_percpu(struct page_pool_recycle_stats);
> > - if (!pool->recycle_stats)
> > - return -ENOMEM;
> > + if (cpuid < 0) {
> > + pool->recycle_stats = alloc_percpu(struct page_pool_recycle_stats);
> > + if (!pool->recycle_stats)
> > + return -ENOMEM;
> > + } else {
>
> Maybe add a short comment here to explain what's going on? Something
> like:
>
> /* When a cpuid is supplied, we're initialising the percpu system page pool
> * instance, so use a singular stats object instead of allocating a
> * separate percpu variable for each (also percpu) page pool instance.
> */
>
> -Toke
>
sure, I will add it.
Regards,
Lorenzo
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [RFC net-next] net: page_pool: fix recycle stats for percpu page_pool allocator
2024-02-14 18:08 [RFC net-next] net: page_pool: fix recycle stats for percpu page_pool allocator Lorenzo Bianconi
2024-02-14 21:42 ` Toke Høiland-Jørgensen
@ 2024-02-15 13:41 ` Alexander Lobakin
2024-02-15 13:51 ` Lorenzo Bianconi
2024-02-15 15:04 ` Jakub Kicinski
1 sibling, 2 replies; 7+ messages in thread
From: Alexander Lobakin @ 2024-02-15 13:41 UTC (permalink / raw)
To: Lorenzo Bianconi
Cc: netdev, lorenzo.bianconi, kuba, davem, edumazet, pabeni, hawk,
ilias.apalodimas, linyunsheng, toke
From: Lorenzo Bianconi <lorenzo@kernel.org>
Date: Wed, 14 Feb 2024 19:08:40 +0100
> Use global page_pool_recycle_stats percpu counter for percpu page_pool
> allocator.
>
> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
> ---
> net/core/page_pool.c | 18 +++++++++++++-----
> 1 file changed, 13 insertions(+), 5 deletions(-)
>
> diff --git a/net/core/page_pool.c b/net/core/page_pool.c
> index 6e0753e6a95b..1bb83b6e7a61 100644
> --- a/net/core/page_pool.c
> +++ b/net/core/page_pool.c
> @@ -31,6 +31,8 @@
> #define BIAS_MAX (LONG_MAX >> 1)
>
> #ifdef CONFIG_PAGE_POOL_STATS
> +static DEFINE_PER_CPU(struct page_pool_recycle_stats, pp_recycle_stats);
> +
> /* alloc_stat_inc is intended to be used in softirq context */
> #define alloc_stat_inc(pool, __stat) (pool->alloc_stats.__stat++)
> /* recycle_stat_inc is safe to use when preemption is possible. */
> @@ -220,14 +222,19 @@ static int page_pool_init(struct page_pool *pool,
> pool->has_init_callback = !!pool->slow.init_callback;
>
> #ifdef CONFIG_PAGE_POOL_STATS
> - pool->recycle_stats = alloc_percpu(struct page_pool_recycle_stats);
> - if (!pool->recycle_stats)
> - return -ENOMEM;
> + if (cpuid < 0) {
TBH I don't like the idea of assuming that only system page_pools might
be created with cpuid >= 0.
For example, if I have an Rx queue always pinned to one CPU, I might
want to create a PP for this queue with the cpuid set already to save
some cycles when recycling. We might also reuse cpuid later for some
more optimizations or features.
Maybe add a new PP_FLAG indicating that system percpu PP stats should be
used?
> + pool->recycle_stats = alloc_percpu(struct page_pool_recycle_stats);
> + if (!pool->recycle_stats)
> + return -ENOMEM;
> + } else {
> + pool->recycle_stats = &pp_recycle_stats;
> + }
> #endif
>
> if (ptr_ring_init(&pool->ring, ring_qsize, GFP_KERNEL) < 0) {
> #ifdef CONFIG_PAGE_POOL_STATS
> - free_percpu(pool->recycle_stats);
> + if (cpuid < 0)
> + free_percpu(pool->recycle_stats);
> #endif
> return -ENOMEM;
> }
> @@ -251,7 +258,8 @@ static void page_pool_uninit(struct page_pool *pool)
> put_device(pool->p.dev);
>
> #ifdef CONFIG_PAGE_POOL_STATS
> - free_percpu(pool->recycle_stats);
> + if (pool->cpuid < 0)
> + free_percpu(pool->recycle_stats);
> #endif
> }
>
Thanks,
Olek
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [RFC net-next] net: page_pool: fix recycle stats for percpu page_pool allocator
2024-02-15 13:41 ` Alexander Lobakin
@ 2024-02-15 13:51 ` Lorenzo Bianconi
2024-02-15 15:04 ` Jakub Kicinski
1 sibling, 0 replies; 7+ messages in thread
From: Lorenzo Bianconi @ 2024-02-15 13:51 UTC (permalink / raw)
To: Alexander Lobakin
Cc: netdev, lorenzo.bianconi, kuba, davem, edumazet, pabeni, hawk,
ilias.apalodimas, linyunsheng, toke
[-- Attachment #1: Type: text/plain, Size: 2749 bytes --]
> From: Lorenzo Bianconi <lorenzo@kernel.org>
> Date: Wed, 14 Feb 2024 19:08:40 +0100
>
> > Use global page_pool_recycle_stats percpu counter for percpu page_pool
> > allocator.
> >
> > Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
> > ---
> > net/core/page_pool.c | 18 +++++++++++++-----
> > 1 file changed, 13 insertions(+), 5 deletions(-)
> >
> > diff --git a/net/core/page_pool.c b/net/core/page_pool.c
> > index 6e0753e6a95b..1bb83b6e7a61 100644
> > --- a/net/core/page_pool.c
> > +++ b/net/core/page_pool.c
> > @@ -31,6 +31,8 @@
> > #define BIAS_MAX (LONG_MAX >> 1)
> >
> > #ifdef CONFIG_PAGE_POOL_STATS
> > +static DEFINE_PER_CPU(struct page_pool_recycle_stats, pp_recycle_stats);
> > +
> > /* alloc_stat_inc is intended to be used in softirq context */
> > #define alloc_stat_inc(pool, __stat) (pool->alloc_stats.__stat++)
> > /* recycle_stat_inc is safe to use when preemption is possible. */
> > @@ -220,14 +222,19 @@ static int page_pool_init(struct page_pool *pool,
> > pool->has_init_callback = !!pool->slow.init_callback;
> >
> > #ifdef CONFIG_PAGE_POOL_STATS
> > - pool->recycle_stats = alloc_percpu(struct page_pool_recycle_stats);
> > - if (!pool->recycle_stats)
> > - return -ENOMEM;
> > + if (cpuid < 0) {
>
> TBH I don't like the idea of assuming that only system page_pools might
> be created with cpuid >= 0.
> For example, if I have an Rx queue always pinned to one CPU, I might
> want to create a PP for this queue with the cpuid set already to save
> some cycles when recycling. We might also reuse cpuid later for some
> more optimizations or features.
>
> Maybe add a new PP_FLAG indicating that system percpu PP stats should be
> used?
Ack, I like the idea. What about creating a flag to indicate this is a percpu
page_pool instead of relying on cpuid value? Maybe it can be useful in the
future, what do you think?
Regards,
Lorenzo
>
> > + pool->recycle_stats = alloc_percpu(struct page_pool_recycle_stats);
> > + if (!pool->recycle_stats)
> > + return -ENOMEM;
> > + } else {
> > + pool->recycle_stats = &pp_recycle_stats;
> > + }
> > #endif
> >
> > if (ptr_ring_init(&pool->ring, ring_qsize, GFP_KERNEL) < 0) {
> > #ifdef CONFIG_PAGE_POOL_STATS
> > - free_percpu(pool->recycle_stats);
> > + if (cpuid < 0)
> > + free_percpu(pool->recycle_stats);
> > #endif
> > return -ENOMEM;
> > }
> > @@ -251,7 +258,8 @@ static void page_pool_uninit(struct page_pool *pool)
> > put_device(pool->p.dev);
> >
> > #ifdef CONFIG_PAGE_POOL_STATS
> > - free_percpu(pool->recycle_stats);
> > + if (pool->cpuid < 0)
> > + free_percpu(pool->recycle_stats);
> > #endif
> > }
> >
>
> Thanks,
> Olek
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [RFC net-next] net: page_pool: fix recycle stats for percpu page_pool allocator
2024-02-15 13:41 ` Alexander Lobakin
2024-02-15 13:51 ` Lorenzo Bianconi
@ 2024-02-15 15:04 ` Jakub Kicinski
2024-02-15 15:31 ` Lorenzo Bianconi
1 sibling, 1 reply; 7+ messages in thread
From: Jakub Kicinski @ 2024-02-15 15:04 UTC (permalink / raw)
To: Alexander Lobakin
Cc: Lorenzo Bianconi, netdev, lorenzo.bianconi, davem, edumazet,
pabeni, hawk, ilias.apalodimas, linyunsheng, toke
On Thu, 15 Feb 2024 14:41:52 +0100 Alexander Lobakin wrote:
> For example, if I have an Rx queue always pinned to one CPU, I might
> want to create a PP for this queue with the cpuid set already to save
> some cycles when recycling. We might also reuse cpuid later for some
> more optimizations or features.
You say "pin Rx queue to one CPU" like that's actually possible to do
reliably :)
> Maybe add a new PP_FLAG indicating that system percpu PP stats should be
> used?
Part of me feels like checking the dev pointer would be good enough.
It may make sense to create more per CPU pools for particular devices
further down, but creating more pools without no dev / DMA mapping
makes no sense, right?
Dunno if looking at dev is not too hacky, tho, flags are cheap.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [RFC net-next] net: page_pool: fix recycle stats for percpu page_pool allocator
2024-02-15 15:04 ` Jakub Kicinski
@ 2024-02-15 15:31 ` Lorenzo Bianconi
0 siblings, 0 replies; 7+ messages in thread
From: Lorenzo Bianconi @ 2024-02-15 15:31 UTC (permalink / raw)
To: Jakub Kicinski
Cc: Alexander Lobakin, netdev, lorenzo.bianconi, davem, edumazet,
pabeni, hawk, ilias.apalodimas, linyunsheng, toke
[-- Attachment #1: Type: text/plain, Size: 885 bytes --]
> On Thu, 15 Feb 2024 14:41:52 +0100 Alexander Lobakin wrote:
> > For example, if I have an Rx queue always pinned to one CPU, I might
> > want to create a PP for this queue with the cpuid set already to save
> > some cycles when recycling. We might also reuse cpuid later for some
> > more optimizations or features.
>
> You say "pin Rx queue to one CPU" like that's actually possible to do
> reliably :)
>
> > Maybe add a new PP_FLAG indicating that system percpu PP stats should be
> > used?
>
> Part of me feels like checking the dev pointer would be good enough.
> It may make sense to create more per CPU pools for particular devices
> further down, but creating more pools without no dev / DMA mapping
> makes no sense, right?
>
> Dunno if looking at dev is not too hacky, tho, flags are cheap.
I would vote for a dedicated flag ;)
Regards,
Lorenzo
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2024-02-15 15:31 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-02-14 18:08 [RFC net-next] net: page_pool: fix recycle stats for percpu page_pool allocator Lorenzo Bianconi
2024-02-14 21:42 ` Toke Høiland-Jørgensen
2024-02-14 22:46 ` Lorenzo Bianconi
2024-02-15 13:41 ` Alexander Lobakin
2024-02-15 13:51 ` Lorenzo Bianconi
2024-02-15 15:04 ` Jakub Kicinski
2024-02-15 15:31 ` Lorenzo Bianconi
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).