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 | ||
