lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Sat, 29 Jan 2022 15:39:00 -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 Cc: Joe Damato <jdamato@...tly.com> Subject: [net-next v2 10/10] net-procfs: Show page pool stats in proc Per-cpu page pool allocation stats are exported in the file /proc/net/page_pool_stat allowing users to better understand the interaction between their drivers and kernel memory allocation. Signed-off-by: Joe Damato <jdamato@...tly.com> --- net/core/net-procfs.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/net/core/net-procfs.c b/net/core/net-procfs.c index 88cc0ad..3d3f3e8 100644 --- a/net/core/net-procfs.c +++ b/net/core/net-procfs.c @@ -4,6 +4,10 @@ #include <linux/seq_file.h> #include <net/wext.h> +#ifdef CONFIG_PAGE_POOL_STATS +#include <net/page_pool.h> +#endif + #define BUCKET_SPACE (32 - NETDEV_HASHBITS - 1) #define get_bucket(x) ((x) >> BUCKET_SPACE) @@ -310,6 +314,58 @@ static const struct seq_operations ptype_seq_ops = { .show = ptype_seq_show, }; +#ifdef CONFIG_PAGE_POOL_STATS +static struct page_pool_stats *page_pool_stat_get_online(loff_t *pos) +{ + struct page_pool_stats *pp_stat = NULL; + + while (*pos < nr_cpu_ids) { + if (cpu_online(*pos)) { + pp_stat = per_cpu_ptr(&page_pool_stats, *pos); + break; + } + + ++*pos; + } + + return pp_stat; +} + +static void *page_pool_seq_start(struct seq_file *seq, loff_t *pos) +{ + return page_pool_stat_get_online(pos); +} + +static void *page_pool_seq_next(struct seq_file *seq, void *v, loff_t *pos) +{ + ++*pos; + return page_pool_stat_get_online(pos); +} + +static void page_pool_seq_stop(struct seq_file *seq, void *v) +{ +} + +static int page_pool_seq_show(struct seq_file *seq, void *v) +{ + struct page_pool_stats *pp_stat = v; + + seq_printf(seq, "%08llx %08llx %08llx %08llx %08llx %08llx %08llx %08llx\n", + seq->index, pp_stat->alloc.fast, + pp_stat->alloc.slow, pp_stat->alloc.slow_high_order, + pp_stat->alloc.empty, pp_stat->alloc.refill, + pp_stat->alloc.refill, pp_stat->alloc.waive); + return 0; +} + +static const struct seq_operations page_pool_seq_ops = { + .start = page_pool_seq_start, + .next = page_pool_seq_next, + .stop = page_pool_seq_stop, + .show = page_pool_seq_show, +}; +#endif + static int __net_init dev_proc_net_init(struct net *net) { int rc = -ENOMEM; @@ -323,12 +379,23 @@ static int __net_init dev_proc_net_init(struct net *net) if (!proc_create_net("ptype", 0444, net->proc_net, &ptype_seq_ops, sizeof(struct seq_net_private))) goto out_softnet; +#ifdef CONFIG_PAGE_POOL_STATS + if (!proc_create_seq("page_pool_stat", 0444, net->proc_net, + &page_pool_seq_ops)) + goto out_ptype; +#endif if (wext_proc_init(net)) - goto out_ptype; + goto out_page_pool; rc = 0; out: return rc; + +out_page_pool: +#ifdef CONFIG_PAGE_POOL_STATS + remove_proc_entry("page_pool_stat", net->proc_net); +#endif + out_ptype: remove_proc_entry("ptype", net->proc_net); out_softnet: -- 2.7.4
Powered by blists - more mailing lists