diff options
author | Keika Kobayashi <kobayashi.kk@ncos.nec.co.jp> | 2009-06-17 19:25:55 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-18 16:03:41 -0400 |
commit | d3d64df21d3d0de675a0d3ffa7c10514f3644b30 (patch) | |
tree | 7ea3c79d8adb2c0282327f9ce63208978857eb07 | |
parent | 9d9b8fb0e5ebf4b0398e579f6061d4451fea3242 (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.txt | 26 | ||||
-rw-r--r-- | fs/proc/Makefile | 1 | ||||
-rw-r--r-- | fs/proc/softirqs.c | 44 | ||||
-rw-r--r-- | fs/proc/stat.c | 15 |
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 : | |||
597 | 0xffffffffa0017000-0xffffffffa0022000 45056 sys_init_module+0xc27/0x1d00 ... | 598 | 0xffffffffa0017000-0xffffffffa0022000 45056 sys_init_module+0xc27/0x1d00 ... |
598 | pages=10 vmalloc N0=10 | 599 | pages=10 vmalloc N0=10 |
599 | 600 | ||
601 | .............................................................................. | ||
602 | |||
603 | softirqs: | ||
604 | |||
605 | Provides 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 | |||
600 | 1.3 IDE devices in /proc/ide | 620 | 1.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 | ||
887 | The very first "cpu" line aggregates the numbers in all of the other "cpuN" | 908 | The very first "cpu" line aggregates the numbers in all of the other "cpuN" |
888 | lines. These numbers identify the amount of time the CPU has spent performing | 909 | lines. These numbers identify the amount of time the CPU has spent performing |
@@ -918,6 +939,11 @@ CPUs. | |||
918 | The "procs_blocked" line gives the number of processes currently blocked, | 939 | The "procs_blocked" line gives the number of processes currently blocked, |
919 | waiting for I/O to complete. | 940 | waiting for I/O to complete. |
920 | 941 | ||
942 | The "softirq" line gives counts of softirqs serviced since boot time, for each | ||
943 | of the possible system softirqs. The first column is the total of all | ||
944 | softirqs serviced; each subsequent column is the total for that particular | ||
945 | softirq. | ||
946 | |||
921 | 947 | ||
922 | 1.9 Ext4 file system parameters | 948 | 1.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 | |||
18 | proc-y += stat.o | 18 | proc-y += stat.o |
19 | proc-y += uptime.o | 19 | proc-y += uptime.o |
20 | proc-y += version.o | 20 | proc-y += version.o |
21 | proc-y += softirqs.o | ||
21 | proc-$(CONFIG_PROC_SYSCTL) += proc_sysctl.o | 22 | proc-$(CONFIG_PROC_SYSCTL) += proc_sysctl.o |
22 | proc-$(CONFIG_NET) += proc_net.o | 23 | proc-$(CONFIG_NET) += proc_net.o |
23 | proc-$(CONFIG_PROC_KCORE) += kcore.o | 24 | proc-$(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 | */ | ||
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); | ||
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 | ||