page_pool: Add function to batch and return stats
Adds a function page_pool_get_stats which can be used by drivers to obtain stats for a specified page_pool. Signed-off-by: Joe Damato <jdamato@fastly.com> Acked-by: Jesper Dangaard Brouer <brouer@redhat.com> Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ad6fa1e1ab
commit
6b95e3388b
|
@ -107,6 +107,23 @@ struct page_pool_recycle_stats {
|
||||||
* refcnt
|
* refcnt
|
||||||
*/
|
*/
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* This struct wraps the above stats structs so users of the
|
||||||
|
* page_pool_get_stats API can pass a single argument when requesting the
|
||||||
|
* stats for the page pool.
|
||||||
|
*/
|
||||||
|
struct page_pool_stats {
|
||||||
|
struct page_pool_alloc_stats alloc_stats;
|
||||||
|
struct page_pool_recycle_stats recycle_stats;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 call page_pool_get_stats to get stats for the specified pool.
|
||||||
|
*/
|
||||||
|
bool page_pool_get_stats(struct page_pool *pool,
|
||||||
|
struct page_pool_stats *stats);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct page_pool {
|
struct page_pool {
|
||||||
|
|
|
@ -35,6 +35,31 @@
|
||||||
struct page_pool_recycle_stats __percpu *s = pool->recycle_stats; \
|
struct page_pool_recycle_stats __percpu *s = pool->recycle_stats; \
|
||||||
this_cpu_inc(s->__stat); \
|
this_cpu_inc(s->__stat); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
bool page_pool_get_stats(struct page_pool *pool,
|
||||||
|
struct page_pool_stats *stats)
|
||||||
|
{
|
||||||
|
int cpu = 0;
|
||||||
|
|
||||||
|
if (!stats)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
memcpy(&stats->alloc_stats, &pool->alloc_stats, sizeof(pool->alloc_stats));
|
||||||
|
|
||||||
|
for_each_possible_cpu(cpu) {
|
||||||
|
const struct page_pool_recycle_stats *pcpu =
|
||||||
|
per_cpu_ptr(pool->recycle_stats, cpu);
|
||||||
|
|
||||||
|
stats->recycle_stats.cached += pcpu->cached;
|
||||||
|
stats->recycle_stats.cache_full += pcpu->cache_full;
|
||||||
|
stats->recycle_stats.ring += pcpu->ring;
|
||||||
|
stats->recycle_stats.ring_full += pcpu->ring_full;
|
||||||
|
stats->recycle_stats.released_refcnt += pcpu->released_refcnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(page_pool_get_stats);
|
||||||
#else
|
#else
|
||||||
#define alloc_stat_inc(pool, __stat)
|
#define alloc_stat_inc(pool, __stat)
|
||||||
#define recycle_stat_inc(pool, __stat)
|
#define recycle_stat_inc(pool, __stat)
|
||||||
|
|
Loading…
Reference in New Issue