162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci#include <linux/init.h>
362306a36Sopenharmony_ci#include <linux/kernel_stat.h>
462306a36Sopenharmony_ci#include <linux/proc_fs.h>
562306a36Sopenharmony_ci#include <linux/seq_file.h>
662306a36Sopenharmony_ci#include "internal.h"
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci/*
962306a36Sopenharmony_ci * /proc/softirqs  ... display the number of softirqs
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_cistatic int show_softirqs(struct seq_file *p, void *v)
1262306a36Sopenharmony_ci{
1362306a36Sopenharmony_ci	int i, j;
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci	seq_puts(p, "                    ");
1662306a36Sopenharmony_ci	for_each_possible_cpu(i)
1762306a36Sopenharmony_ci		seq_printf(p, "CPU%-8d", i);
1862306a36Sopenharmony_ci	seq_putc(p, '\n');
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci	for (i = 0; i < NR_SOFTIRQS; i++) {
2162306a36Sopenharmony_ci		seq_printf(p, "%12s:", softirq_to_name[i]);
2262306a36Sopenharmony_ci		for_each_possible_cpu(j)
2362306a36Sopenharmony_ci			seq_printf(p, " %10u", kstat_softirqs_cpu(i, j));
2462306a36Sopenharmony_ci		seq_putc(p, '\n');
2562306a36Sopenharmony_ci	}
2662306a36Sopenharmony_ci	return 0;
2762306a36Sopenharmony_ci}
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cistatic int __init proc_softirqs_init(void)
3062306a36Sopenharmony_ci{
3162306a36Sopenharmony_ci	struct proc_dir_entry *pde;
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci	pde = proc_create_single("softirqs", 0, NULL, show_softirqs);
3462306a36Sopenharmony_ci	pde_make_permanent(pde);
3562306a36Sopenharmony_ci	return 0;
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_cifs_initcall(proc_softirqs_init);
38