Message ID | 1643933373-6590-12-git-send-email-jdamato@fastly.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | page_pool: Add page_pool stat counters | expand |
On Thu, Feb 03, 2022 at 04:09:33PM -0800, Joe Damato wrote: > Adds a function page_pool_get_stats which can be used by drivers to obtain > the batched stats for a specified page pool. > > Signed-off-by: Joe Damato <jdamato@fastly.com> > --- > include/net/page_pool.h | 9 +++++++++ > net/core/page_pool.c | 25 +++++++++++++++++++++++++ > 2 files changed, 34 insertions(+) > > diff --git a/include/net/page_pool.h b/include/net/page_pool.h > index bb87706..5257e46 100644 > --- a/include/net/page_pool.h > +++ b/include/net/page_pool.h > @@ -153,6 +153,15 @@ struct page_pool_stats { > u64 waive; /* failed refills due to numa zone mismatch */ > } alloc; > }; > + > +/* > + * Drivers that wish to harvest page pool stats and report them to users > + * (perhaps via ethtool, debugfs, or another mechanism) can allocate a > + * struct page_pool_stats and call page_pool_get_stats to get the batched pcpu > + * stats. > + */ > +struct page_pool_stats *page_pool_get_stats(struct page_pool *pool, > + struct page_pool_stats *stats); > #endif > > struct page *page_pool_alloc_pages(struct page_pool *pool, gfp_t gfp); > diff --git a/net/core/page_pool.c b/net/core/page_pool.c > index 0bd084c..076593bb 100644 > --- a/net/core/page_pool.c > +++ b/net/core/page_pool.c > @@ -35,6 +35,31 @@ > struct page_pool_stats __percpu *s = pool->stats; \ > __this_cpu_inc(s->alloc.__stat); \ > } while (0) > + > +struct page_pool_stats *page_pool_get_stats(struct page_pool *pool, > + struct page_pool_stats *stats) > +{ > + int cpu = 0; > + > + if (!stats) > + return NULL; > + > + for_each_possible_cpu(cpu) { > + const struct page_pool_stats *pcpu = > + per_cpu_ptr(pool->stats, cpu); > + > + stats->alloc.fast += pcpu->alloc.fast; > + stats->alloc.slow += pcpu->alloc.slow; > + stats->alloc.slow_high_order += > + pcpu->alloc.slow_high_order; > + stats->alloc.empty += pcpu->alloc.empty; > + stats->alloc.refill += pcpu->alloc.refill; > + stats->alloc.waive += pcpu->alloc.waive; > + } > + > + return stats; > +} > +EXPORT_SYMBOL(page_pool_get_stats); You don't really need to return a pointer here. Just make the return code a bool Regards /Ilias > #else > #define this_cpu_inc_alloc_stat(pool, __stat) > #endif > -- > 2.7.4 >
On Thu, Feb 3, 2022 at 11:46 PM Ilias Apalodimas <ilias.apalodimas@linaro.org> wrote: > > On Thu, Feb 03, 2022 at 04:09:33PM -0800, Joe Damato wrote: > > Adds a function page_pool_get_stats which can be used by drivers to obtain > > the batched stats for a specified page pool. > > > > Signed-off-by: Joe Damato <jdamato@fastly.com> > > --- > > include/net/page_pool.h | 9 +++++++++ > > net/core/page_pool.c | 25 +++++++++++++++++++++++++ > > 2 files changed, 34 insertions(+) > > > > diff --git a/include/net/page_pool.h b/include/net/page_pool.h > > index bb87706..5257e46 100644 > > --- a/include/net/page_pool.h > > +++ b/include/net/page_pool.h > > @@ -153,6 +153,15 @@ struct page_pool_stats { > > u64 waive; /* failed refills due to numa zone mismatch */ > > } alloc; > > }; > > + > > +/* > > + * Drivers that wish to harvest page pool stats and report them to users > > + * (perhaps via ethtool, debugfs, or another mechanism) can allocate a > > + * struct page_pool_stats and call page_pool_get_stats to get the batched pcpu > > + * stats. > > + */ > > +struct page_pool_stats *page_pool_get_stats(struct page_pool *pool, > > + struct page_pool_stats *stats); > > #endif > > > > struct page *page_pool_alloc_pages(struct page_pool *pool, gfp_t gfp); > > diff --git a/net/core/page_pool.c b/net/core/page_pool.c > > index 0bd084c..076593bb 100644 > > --- a/net/core/page_pool.c > > +++ b/net/core/page_pool.c > > @@ -35,6 +35,31 @@ > > struct page_pool_stats __percpu *s = pool->stats; \ > > __this_cpu_inc(s->alloc.__stat); \ > > } while (0) > > + > > +struct page_pool_stats *page_pool_get_stats(struct page_pool *pool, > > + struct page_pool_stats *stats) > > +{ > > + int cpu = 0; > > + > > + if (!stats) > > + return NULL; > > + > > + for_each_possible_cpu(cpu) { > > + const struct page_pool_stats *pcpu = > > + per_cpu_ptr(pool->stats, cpu); > > + > > + stats->alloc.fast += pcpu->alloc.fast; > > + stats->alloc.slow += pcpu->alloc.slow; > > + stats->alloc.slow_high_order += > > + pcpu->alloc.slow_high_order; > > + stats->alloc.empty += pcpu->alloc.empty; > > + stats->alloc.refill += pcpu->alloc.refill; > > + stats->alloc.waive += pcpu->alloc.waive; > > + } > > + > > + return stats; > > +} > > +EXPORT_SYMBOL(page_pool_get_stats); > > You don't really need to return a pointer here. Just make the return code a > bool OK. Updated page_pool_get_stats to return a bool in my v5 branch.
diff --git a/include/net/page_pool.h b/include/net/page_pool.h index bb87706..5257e46 100644 --- a/include/net/page_pool.h +++ b/include/net/page_pool.h @@ -153,6 +153,15 @@ struct page_pool_stats { u64 waive; /* failed refills due to numa zone mismatch */ } alloc; }; + +/* + * Drivers that wish to harvest page pool stats and report them to users + * (perhaps via ethtool, debugfs, or another mechanism) can allocate a + * struct page_pool_stats and call page_pool_get_stats to get the batched pcpu + * stats. + */ +struct page_pool_stats *page_pool_get_stats(struct page_pool *pool, + struct page_pool_stats *stats); #endif struct page *page_pool_alloc_pages(struct page_pool *pool, gfp_t gfp); diff --git a/net/core/page_pool.c b/net/core/page_pool.c index 0bd084c..076593bb 100644 --- a/net/core/page_pool.c +++ b/net/core/page_pool.c @@ -35,6 +35,31 @@ struct page_pool_stats __percpu *s = pool->stats; \ __this_cpu_inc(s->alloc.__stat); \ } while (0) + +struct page_pool_stats *page_pool_get_stats(struct page_pool *pool, + struct page_pool_stats *stats) +{ + int cpu = 0; + + if (!stats) + return NULL; + + for_each_possible_cpu(cpu) { + const struct page_pool_stats *pcpu = + per_cpu_ptr(pool->stats, cpu); + + stats->alloc.fast += pcpu->alloc.fast; + stats->alloc.slow += pcpu->alloc.slow; + stats->alloc.slow_high_order += + pcpu->alloc.slow_high_order; + stats->alloc.empty += pcpu->alloc.empty; + stats->alloc.refill += pcpu->alloc.refill; + stats->alloc.waive += pcpu->alloc.waive; + } + + return stats; +} +EXPORT_SYMBOL(page_pool_get_stats); #else #define this_cpu_inc_alloc_stat(pool, __stat) #endif
Adds a function page_pool_get_stats which can be used by drivers to obtain the batched stats for a specified page pool. Signed-off-by: Joe Damato <jdamato@fastly.com> --- include/net/page_pool.h | 9 +++++++++ net/core/page_pool.c | 25 +++++++++++++++++++++++++ 2 files changed, 34 insertions(+)