[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1644868949-24506-3-git-send-email-jdamato@fastly.com>
Date: Mon, 14 Feb 2022 12:02:29 -0800
From: Joe Damato <jdamato@...tly.com>
To: netdev@...r.kernel.org, kuba@...nel.org,
ilias.apalodimas@...aro.org, davem@...emloft.net, hawk@...nel.org,
saeed@...nel.org, ttoukan.linux@...il.com, brouer@...hat.com
Cc: Joe Damato <jdamato@...tly.com>
Subject: [net-next v5 2/2] page_pool: Add function to batch and return stats
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@...tly.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 d827ab1..6016c0c 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.
+ */
+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);
diff --git a/net/core/page_pool.c b/net/core/page_pool.c
index f29dff9..9cad108 100644
--- a/net/core/page_pool.c
+++ b/net/core/page_pool.c
@@ -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
--
2.7.4
Powered by blists - more mailing lists