Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

proc: export statistics for softirq to /proc

Export statistics for softirq in /proc/softirqs and /proc/stat.

1. /proc/softirqs
Implement /proc/softirqs which shows the number of softirq
for each CPU like /proc/interrupts.

2. /proc/stat
Add the "softirq" line to /proc/stat.
This line shows the number of softirq for all cpu.
The first column is the total of all softirqs and
each subsequent column is the total for particular softirq.

[kosaki.motohiro@jp.fujitsu.com: remove redundant for_each_possible_cpu() loop]
Signed-off-by: Keika Kobayashi <kobayashi.kk@ncos.nec.co.jp>
Reviewed-by: Hiroshi Shimamoto <h-shimamoto@ct.jp.nec.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Eric Dumazet <dada1@cosmosbay.com>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Keika Kobayashi and committed by
Linus Torvalds
d3d64df2 9d9b8fb0

+86
+26
Documentation/filesystems/proc.txt
··· 283 283 rtc Real time clock 284 284 scsi SCSI info (see text) 285 285 slabinfo Slab pool info 286 + softirqs softirq usage 286 287 stat Overall statistics 287 288 swaps Swap space utilization 288 289 sys See chapter 2 ··· 598 597 0xffffffffa0017000-0xffffffffa0022000 45056 sys_init_module+0xc27/0x1d00 ... 599 598 pages=10 vmalloc N0=10 600 599 600 + .............................................................................. 601 + 602 + softirqs: 603 + 604 + Provides counts of softirq handlers serviced since boot time, for each cpu. 605 + 606 + > cat /proc/softirqs 607 + CPU0 CPU1 CPU2 CPU3 608 + HI: 0 0 0 0 609 + TIMER: 27166 27120 27097 27034 610 + NET_TX: 0 0 0 17 611 + NET_RX: 42 0 0 39 612 + BLOCK: 0 0 107 1121 613 + TASKLET: 0 0 0 290 614 + SCHED: 27035 26983 26971 26746 615 + HRTIMER: 0 0 0 0 616 + RCU: 1678 1769 2178 2250 617 + 618 + 601 619 1.3 IDE devices in /proc/ide 602 620 ---------------------------- 603 621 ··· 903 883 processes 2915 904 884 procs_running 1 905 885 procs_blocked 0 886 + softirq 183433 0 21755 12 39 1137 231 21459 2263 906 887 907 888 The very first "cpu" line aggregates the numbers in all of the other "cpuN" 908 889 lines. These numbers identify the amount of time the CPU has spent performing ··· 938 917 939 918 The "procs_blocked" line gives the number of processes currently blocked, 940 919 waiting for I/O to complete. 920 + 921 + The "softirq" line gives counts of softirqs serviced since boot time, for each 922 + of the possible system softirqs. The first column is the total of all 923 + softirqs serviced; each subsequent column is the total for that particular 924 + softirq. 941 925 942 926 943 927 1.9 Ext4 file system parameters
+1
fs/proc/Makefile
··· 18 18 proc-y += stat.o 19 19 proc-y += uptime.o 20 20 proc-y += version.o 21 + proc-y += softirqs.o 21 22 proc-$(CONFIG_PROC_SYSCTL) += proc_sysctl.o 22 23 proc-$(CONFIG_NET) += proc_net.o 23 24 proc-$(CONFIG_PROC_KCORE) += kcore.o
+44
fs/proc/softirqs.c
··· 1 + #include <linux/init.h> 2 + #include <linux/kernel_stat.h> 3 + #include <linux/proc_fs.h> 4 + #include <linux/seq_file.h> 5 + 6 + /* 7 + * /proc/softirqs ... display the number of softirqs 8 + */ 9 + static int show_softirqs(struct seq_file *p, void *v) 10 + { 11 + int i, j; 12 + 13 + seq_printf(p, " "); 14 + for_each_possible_cpu(i) 15 + seq_printf(p, "CPU%-8d", i); 16 + seq_printf(p, "\n"); 17 + 18 + for (i = 0; i < NR_SOFTIRQS; i++) { 19 + seq_printf(p, "%8s:", softirq_to_name[i]); 20 + for_each_possible_cpu(j) 21 + seq_printf(p, " %10u", kstat_softirqs_cpu(i, j)); 22 + seq_printf(p, "\n"); 23 + } 24 + return 0; 25 + } 26 + 27 + static int softirqs_open(struct inode *inode, struct file *file) 28 + { 29 + return single_open(file, show_softirqs, NULL); 30 + } 31 + 32 + static const struct file_operations proc_softirqs_operations = { 33 + .open = softirqs_open, 34 + .read = seq_read, 35 + .llseek = seq_lseek, 36 + .release = single_release, 37 + }; 38 + 39 + static int __init proc_softirqs_init(void) 40 + { 41 + proc_create("softirqs", 0, NULL, &proc_softirqs_operations); 42 + return 0; 43 + } 44 + module_init(proc_softirqs_init);
+15
fs/proc/stat.c
··· 29 29 cputime64_t user, nice, system, idle, iowait, irq, softirq, steal; 30 30 cputime64_t guest; 31 31 u64 sum = 0; 32 + u64 sum_softirq = 0; 33 + unsigned int per_softirq_sums[NR_SOFTIRQS] = {0}; 32 34 struct timespec boottime; 33 35 unsigned int per_irq_sum; 34 36 ··· 55 53 sum += kstat_irqs_cpu(j, i); 56 54 } 57 55 sum += arch_irq_stat_cpu(i); 56 + 57 + for (j = 0; j < NR_SOFTIRQS; j++) { 58 + unsigned int softirq_stat = kstat_softirqs_cpu(j, i); 59 + 60 + per_softirq_sums[j] += softirq_stat; 61 + sum_softirq += softirq_stat; 62 + } 58 63 } 59 64 sum += arch_irq_stat(); 60 65 ··· 123 114 total_forks, 124 115 nr_running(), 125 116 nr_iowait()); 117 + 118 + seq_printf(p, "softirq %llu", (unsigned long long)sum_softirq); 119 + 120 + for (i = 0; i < NR_SOFTIRQS; i++) 121 + seq_printf(p, " %u", per_softirq_sums[i]); 122 + seq_printf(p, "\n"); 126 123 127 124 return 0; 128 125 }