aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeika Kobayashi <kobayashi.kk@ncos.nec.co.jp>2009-06-17 19:25:55 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2009-06-18 16:03:41 -0400
commitd3d64df21d3d0de675a0d3ffa7c10514f3644b30 (patch)
tree7ea3c79d8adb2c0282327f9ce63208978857eb07
parent9d9b8fb0e5ebf4b0398e579f6061d4451fea3242 (diff)
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>
-rw-r--r--Documentation/filesystems/proc.txt26
-rw-r--r--fs/proc/Makefile1
-rw-r--r--fs/proc/softirqs.c44
-rw-r--r--fs/proc/stat.c15
4 files changed, 86 insertions, 0 deletions
diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt
index ebff3c10a07f..fb7d649437af 100644
--- a/Documentation/filesystems/proc.txt
+++ b/Documentation/filesystems/proc.txt
@@ -283,6 +283,7 @@ Table 1-4: Kernel info in /proc
283 rtc Real time clock 283 rtc Real time clock
284 scsi SCSI info (see text) 284 scsi SCSI info (see text)
285 slabinfo Slab pool info 285 slabinfo Slab pool info
286 softirqs softirq usage
286 stat Overall statistics 287 stat Overall statistics
287 swaps Swap space utilization 288 swaps Swap space utilization
288 sys See chapter 2 289 sys See chapter 2
@@ -597,6 +598,25 @@ on the kind of area :
5970xffffffffa0017000-0xffffffffa0022000 45056 sys_init_module+0xc27/0x1d00 ... 5980xffffffffa0017000-0xffffffffa0022000 45056 sys_init_module+0xc27/0x1d00 ...
598 pages=10 vmalloc N0=10 599 pages=10 vmalloc N0=10
599 600
601..............................................................................
602
603softirqs:
604
605Provides counts of softirq handlers serviced since boot time, for each cpu.
606
607> cat /proc/softirqs
608 CPU0 CPU1 CPU2 CPU3
609 HI: 0 0 0 0
610 TIMER: 27166 27120 27097 27034
611 NET_TX: 0 0 0 17
612 NET_RX: 42 0 0 39
613 BLOCK: 0 0 107 1121
614 TASKLET: 0 0 0 290
615 SCHED: 27035 26983 26971 26746
616 HRTIMER: 0 0 0 0
617 RCU: 1678 1769 2178 2250
618
619
6001.3 IDE devices in /proc/ide 6201.3 IDE devices in /proc/ide
601---------------------------- 621----------------------------
602 622
@@ -883,6 +903,7 @@ since the system first booted. For a quick look, simply cat the file:
883 processes 2915 903 processes 2915
884 procs_running 1 904 procs_running 1
885 procs_blocked 0 905 procs_blocked 0
906 softirq 183433 0 21755 12 39 1137 231 21459 2263
886 907
887The very first "cpu" line aggregates the numbers in all of the other "cpuN" 908The very first "cpu" line aggregates the numbers in all of the other "cpuN"
888lines. These numbers identify the amount of time the CPU has spent performing 909lines. These numbers identify the amount of time the CPU has spent performing
@@ -918,6 +939,11 @@ CPUs.
918The "procs_blocked" line gives the number of processes currently blocked, 939The "procs_blocked" line gives the number of processes currently blocked,
919waiting for I/O to complete. 940waiting for I/O to complete.
920 941
942The "softirq" line gives counts of softirqs serviced since boot time, for each
943of the possible system softirqs. The first column is the total of all
944softirqs serviced; each subsequent column is the total for that particular
945softirq.
946
921 947
9221.9 Ext4 file system parameters 9481.9 Ext4 file system parameters
923------------------------------ 949------------------------------
diff --git a/fs/proc/Makefile b/fs/proc/Makefile
index 63d965193b22..11a7b5c68153 100644
--- a/fs/proc/Makefile
+++ b/fs/proc/Makefile
@@ -18,6 +18,7 @@ proc-y += meminfo.o
18proc-y += stat.o 18proc-y += stat.o
19proc-y += uptime.o 19proc-y += uptime.o
20proc-y += version.o 20proc-y += version.o
21proc-y += softirqs.o
21proc-$(CONFIG_PROC_SYSCTL) += proc_sysctl.o 22proc-$(CONFIG_PROC_SYSCTL) += proc_sysctl.o
22proc-$(CONFIG_NET) += proc_net.o 23proc-$(CONFIG_NET) += proc_net.o
23proc-$(CONFIG_PROC_KCORE) += kcore.o 24proc-$(CONFIG_PROC_KCORE) += kcore.o
diff --git a/fs/proc/softirqs.c b/fs/proc/softirqs.c
new file mode 100644
index 000000000000..1807c2419f17
--- /dev/null
+++ b/fs/proc/softirqs.c
@@ -0,0 +1,44 @@
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 */
9static 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
27static int softirqs_open(struct inode *inode, struct file *file)
28{
29 return single_open(file, show_softirqs, NULL);
30}
31
32static 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
39static int __init proc_softirqs_init(void)
40{
41 proc_create("softirqs", 0, NULL, &proc_softirqs_operations);
42 return 0;
43}
44module_init(proc_softirqs_init);
diff --git a/fs/proc/stat.c b/fs/proc/stat.c
index 81e4eb60972e..7cc726c6d70a 100644
--- a/fs/proc/stat.c
+++ b/fs/proc/stat.c
@@ -29,6 +29,8 @@ static int show_stat(struct seq_file *p, void *v)
29 cputime64_t user, nice, system, idle, iowait, irq, softirq, steal; 29 cputime64_t user, nice, system, idle, iowait, irq, softirq, steal;
30 cputime64_t guest; 30 cputime64_t guest;
31 u64 sum = 0; 31 u64 sum = 0;
32 u64 sum_softirq = 0;
33 unsigned int per_softirq_sums[NR_SOFTIRQS] = {0};
32 struct timespec boottime; 34 struct timespec boottime;
33 unsigned int per_irq_sum; 35 unsigned int per_irq_sum;
34 36
@@ -53,6 +55,13 @@ static int show_stat(struct seq_file *p, void *v)
53 sum += kstat_irqs_cpu(j, i); 55 sum += kstat_irqs_cpu(j, i);
54 } 56 }
55 sum += arch_irq_stat_cpu(i); 57 sum += arch_irq_stat_cpu(i);
58
59 for (j = 0; j < NR_SOFTIRQS; j++) {
60 unsigned int softirq_stat = kstat_softirqs_cpu(j, i);
61
62 per_softirq_sums[j] += softirq_stat;
63 sum_softirq += softirq_stat;
64 }
56 } 65 }
57 sum += arch_irq_stat(); 66 sum += arch_irq_stat();
58 67
@@ -115,6 +124,12 @@ static int show_stat(struct seq_file *p, void *v)
115 nr_running(), 124 nr_running(),
116 nr_iowait()); 125 nr_iowait());
117 126
127 seq_printf(p, "softirq %llu", (unsigned long long)sum_softirq);
128
129 for (i = 0; i < NR_SOFTIRQS; i++)
130 seq_printf(p, " %u", per_softirq_sums[i]);
131 seq_printf(p, "\n");
132
118 return 0; 133 return 0;
119} 134}
120 135