@@ -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.
+ */
+bool 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);
@@ -33,6 +33,31 @@
struct page_pool_stats __percpu *s = pool->stats; \
__this_cpu_inc(s->alloc.__stat); \
} while (0)
+
+bool page_pool_get_stats(struct page_pool *pool,
+ struct page_pool_stats *stats)
+{
+ int cpu = 0;
+
+ if (!stats)
+ return false;
+
+ 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 true;
+}
+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(+)