Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 180 lines (160 sloc) 5.169 kb
73784b3 Umesh Krishnan Base line for SHIVA - Based from PSP 3.00.01.06
umeshkrishnan authored
1 #include <linux/cpumask.h>
2 #include <linux/fs.h>
3 #include <linux/gfp.h>
4 #include <linux/init.h>
5 #include <linux/interrupt.h>
6 #include <linux/kernel_stat.h>
7 #include <linux/proc_fs.h>
8 #include <linux/sched.h>
9 #include <linux/seq_file.h>
10 #include <linux/slab.h>
11 #include <linux/time.h>
12 #include <linux/irqnr.h>
13 #include <asm/cputime.h>
14
15 #ifndef arch_irq_stat_cpu
16 #define arch_irq_stat_cpu(cpu) 0
17 #endif
18 #ifndef arch_irq_stat
19 #define arch_irq_stat() 0
20 #endif
21 #ifndef arch_idle_time
22 #define arch_idle_time(cpu) 0
23 #endif
24
25 static int show_stat(struct seq_file *p, void *v)
26 {
27 int i, j;
28 unsigned long jif;
29 cputime64_t user, nice, system, idle, iowait, irq, softirq, steal;
30 cputime64_t guest, guest_nice;
31 u64 sum = 0;
32 u64 sum_softirq = 0;
33 unsigned int per_softirq_sums[NR_SOFTIRQS] = {0};
34 struct timespec boottime;
35 unsigned int per_irq_sum;
36
37 user = nice = system = idle = iowait =
38 irq = softirq = steal = cputime64_zero;
39 guest = guest_nice = cputime64_zero;
40 getboottime(&boottime);
41 jif = boottime.tv_sec;
42
43 for_each_possible_cpu(i) {
44 user = cputime64_add(user, kstat_cpu(i).cpustat.user);
45 nice = cputime64_add(nice, kstat_cpu(i).cpustat.nice);
46 system = cputime64_add(system, kstat_cpu(i).cpustat.system);
47 idle = cputime64_add(idle, kstat_cpu(i).cpustat.idle);
48 idle = cputime64_add(idle, arch_idle_time(i));
49 iowait = cputime64_add(iowait, kstat_cpu(i).cpustat.iowait);
50 irq = cputime64_add(irq, kstat_cpu(i).cpustat.irq);
51 softirq = cputime64_add(softirq, kstat_cpu(i).cpustat.softirq);
52 steal = cputime64_add(steal, kstat_cpu(i).cpustat.steal);
53 guest = cputime64_add(guest, kstat_cpu(i).cpustat.guest);
54 guest_nice = cputime64_add(guest_nice,
55 kstat_cpu(i).cpustat.guest_nice);
56 for_each_irq_nr(j) {
57 sum += kstat_irqs_cpu(j, i);
58 }
59 sum += arch_irq_stat_cpu(i);
60
61 for (j = 0; j < NR_SOFTIRQS; j++) {
62 unsigned int softirq_stat = kstat_softirqs_cpu(j, i);
63
64 per_softirq_sums[j] += softirq_stat;
65 sum_softirq += softirq_stat;
66 }
67 }
68 sum += arch_irq_stat();
69
70 seq_printf(p, "cpu %llu %llu %llu %llu %llu %llu %llu %llu %llu "
71 "%llu\n",
72 (unsigned long long)cputime64_to_clock_t(user),
73 (unsigned long long)cputime64_to_clock_t(nice),
74 (unsigned long long)cputime64_to_clock_t(system),
75 (unsigned long long)cputime64_to_clock_t(idle),
76 (unsigned long long)cputime64_to_clock_t(iowait),
77 (unsigned long long)cputime64_to_clock_t(irq),
78 (unsigned long long)cputime64_to_clock_t(softirq),
79 (unsigned long long)cputime64_to_clock_t(steal),
80 (unsigned long long)cputime64_to_clock_t(guest),
81 (unsigned long long)cputime64_to_clock_t(guest_nice));
82 for_each_online_cpu(i) {
83
84 /* Copy values here to work around gcc-2.95.3, gcc-2.96 */
85 user = kstat_cpu(i).cpustat.user;
86 nice = kstat_cpu(i).cpustat.nice;
87 system = kstat_cpu(i).cpustat.system;
88 idle = kstat_cpu(i).cpustat.idle;
89 idle = cputime64_add(idle, arch_idle_time(i));
90 iowait = kstat_cpu(i).cpustat.iowait;
91 irq = kstat_cpu(i).cpustat.irq;
92 softirq = kstat_cpu(i).cpustat.softirq;
93 steal = kstat_cpu(i).cpustat.steal;
94 guest = kstat_cpu(i).cpustat.guest;
95 guest_nice = kstat_cpu(i).cpustat.guest_nice;
96 seq_printf(p,
97 "cpu%d %llu %llu %llu %llu %llu %llu %llu %llu %llu "
98 "%llu\n",
99 i,
100 (unsigned long long)cputime64_to_clock_t(user),
101 (unsigned long long)cputime64_to_clock_t(nice),
102 (unsigned long long)cputime64_to_clock_t(system),
103 (unsigned long long)cputime64_to_clock_t(idle),
104 (unsigned long long)cputime64_to_clock_t(iowait),
105 (unsigned long long)cputime64_to_clock_t(irq),
106 (unsigned long long)cputime64_to_clock_t(softirq),
107 (unsigned long long)cputime64_to_clock_t(steal),
108 (unsigned long long)cputime64_to_clock_t(guest),
109 (unsigned long long)cputime64_to_clock_t(guest_nice));
110 }
111 seq_printf(p, "intr %llu", (unsigned long long)sum);
112
113 /* sum again ? it could be updated? */
114 for_each_irq_nr(j) {
115 per_irq_sum = 0;
116 for_each_possible_cpu(i)
117 per_irq_sum += kstat_irqs_cpu(j, i);
118
119 seq_printf(p, " %u", per_irq_sum);
120 }
121
122 seq_printf(p,
123 "\nctxt %llu\n"
124 "btime %lu\n"
125 "processes %lu\n"
126 "procs_running %lu\n"
127 "procs_blocked %lu\n",
128 nr_context_switches(),
129 (unsigned long)jif,
130 total_forks,
131 nr_running(),
132 nr_iowait());
133
134 seq_printf(p, "softirq %llu", (unsigned long long)sum_softirq);
135
136 for (i = 0; i < NR_SOFTIRQS; i++)
137 seq_printf(p, " %u", per_softirq_sums[i]);
138 seq_printf(p, "\n");
139
140 return 0;
141 }
142
143 static int stat_open(struct inode *inode, struct file *file)
144 {
145 unsigned size = 4096 * (1 + num_possible_cpus() / 32);
146 char *buf;
147 struct seq_file *m;
148 int res;
149
150 /* don't ask for more than the kmalloc() max size, currently 128 KB */
151 if (size > 128 * 1024)
152 size = 128 * 1024;
153 buf = kmalloc(size, GFP_KERNEL);
154 if (!buf)
155 return -ENOMEM;
156
157 res = single_open(file, show_stat, NULL);
158 if (!res) {
159 m = file->private_data;
160 m->buf = buf;
161 m->size = size;
162 } else
163 kfree(buf);
164 return res;
165 }
166
167 static const struct file_operations proc_stat_operations = {
168 .open = stat_open,
169 .read = seq_read,
170 .llseek = seq_lseek,
171 .release = single_release,
172 };
173
174 static int __init proc_stat_init(void)
175 {
176 proc_create("stat", 0, NULL, &proc_stat_operations);
177 return 0;
178 }
179 module_init(proc_stat_init);
Something went wrong with that request. Please try again.