hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/fs/proc/stat.c
....@@ -23,21 +23,21 @@
2323
2424 #ifdef arch_idle_time
2525
26
-static u64 get_idle_time(int cpu)
26
+u64 get_idle_time(struct kernel_cpustat *kcs, int cpu)
2727 {
2828 u64 idle;
2929
30
- idle = kcpustat_cpu(cpu).cpustat[CPUTIME_IDLE];
30
+ idle = kcs->cpustat[CPUTIME_IDLE];
3131 if (cpu_online(cpu) && !nr_iowait_cpu(cpu))
3232 idle += arch_idle_time(cpu);
3333 return idle;
3434 }
3535
36
-static u64 get_iowait_time(int cpu)
36
+static u64 get_iowait_time(struct kernel_cpustat *kcs, int cpu)
3737 {
3838 u64 iowait;
3939
40
- iowait = kcpustat_cpu(cpu).cpustat[CPUTIME_IOWAIT];
40
+ iowait = kcs->cpustat[CPUTIME_IOWAIT];
4141 if (cpu_online(cpu) && nr_iowait_cpu(cpu))
4242 iowait += arch_idle_time(cpu);
4343 return iowait;
....@@ -45,7 +45,7 @@
4545
4646 #else
4747
48
-static u64 get_idle_time(int cpu)
48
+u64 get_idle_time(struct kernel_cpustat *kcs, int cpu)
4949 {
5050 u64 idle, idle_usecs = -1ULL;
5151
....@@ -54,14 +54,14 @@
5454
5555 if (idle_usecs == -1ULL)
5656 /* !NO_HZ or cpu offline so we can rely on cpustat.idle */
57
- idle = kcpustat_cpu(cpu).cpustat[CPUTIME_IDLE];
57
+ idle = kcs->cpustat[CPUTIME_IDLE];
5858 else
5959 idle = idle_usecs * NSEC_PER_USEC;
6060
6161 return idle;
6262 }
6363
64
-static u64 get_iowait_time(int cpu)
64
+static u64 get_iowait_time(struct kernel_cpustat *kcs, int cpu)
6565 {
6666 u64 iowait, iowait_usecs = -1ULL;
6767
....@@ -70,7 +70,7 @@
7070
7171 if (iowait_usecs == -1ULL)
7272 /* !NO_HZ or cpu offline so we can rely on cpustat.iowait */
73
- iowait = kcpustat_cpu(cpu).cpustat[CPUTIME_IOWAIT];
73
+ iowait = kcs->cpustat[CPUTIME_IOWAIT];
7474 else
7575 iowait = iowait_usecs * NSEC_PER_USEC;
7676
....@@ -78,6 +78,31 @@
7878 }
7979
8080 #endif
81
+
82
+static void show_irq_gap(struct seq_file *p, unsigned int gap)
83
+{
84
+ static const char zeros[] = " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0";
85
+
86
+ while (gap > 0) {
87
+ unsigned int inc;
88
+
89
+ inc = min_t(unsigned int, gap, ARRAY_SIZE(zeros) / 2);
90
+ seq_write(p, zeros, 2 * inc);
91
+ gap -= inc;
92
+ }
93
+}
94
+
95
+static void show_all_irqs(struct seq_file *p)
96
+{
97
+ unsigned int i, next = 0;
98
+
99
+ for_each_active_irq(i) {
100
+ show_irq_gap(p, i - next);
101
+ seq_put_decimal_ull(p, " ", kstat_irqs_usr(i));
102
+ next = i + 1;
103
+ }
104
+ show_irq_gap(p, nr_irqs - next);
105
+}
81106
82107 static int show_stat(struct seq_file *p, void *v)
83108 {
....@@ -95,18 +120,23 @@
95120 getboottime64(&boottime);
96121
97122 for_each_possible_cpu(i) {
98
- user += kcpustat_cpu(i).cpustat[CPUTIME_USER];
99
- nice += kcpustat_cpu(i).cpustat[CPUTIME_NICE];
100
- system += kcpustat_cpu(i).cpustat[CPUTIME_SYSTEM];
101
- idle += get_idle_time(i);
102
- iowait += get_iowait_time(i);
103
- irq += kcpustat_cpu(i).cpustat[CPUTIME_IRQ];
104
- softirq += kcpustat_cpu(i).cpustat[CPUTIME_SOFTIRQ];
105
- steal += kcpustat_cpu(i).cpustat[CPUTIME_STEAL];
106
- guest += kcpustat_cpu(i).cpustat[CPUTIME_GUEST];
107
- guest_nice += kcpustat_cpu(i).cpustat[CPUTIME_GUEST_NICE];
108
- sum += kstat_cpu_irqs_sum(i);
109
- sum += arch_irq_stat_cpu(i);
123
+ struct kernel_cpustat kcpustat;
124
+ u64 *cpustat = kcpustat.cpustat;
125
+
126
+ kcpustat_cpu_fetch(&kcpustat, i);
127
+
128
+ user += cpustat[CPUTIME_USER];
129
+ nice += cpustat[CPUTIME_NICE];
130
+ system += cpustat[CPUTIME_SYSTEM];
131
+ idle += get_idle_time(&kcpustat, i);
132
+ iowait += get_iowait_time(&kcpustat, i);
133
+ irq += cpustat[CPUTIME_IRQ];
134
+ softirq += cpustat[CPUTIME_SOFTIRQ];
135
+ steal += cpustat[CPUTIME_STEAL];
136
+ guest += cpustat[CPUTIME_GUEST];
137
+ guest_nice += cpustat[CPUTIME_GUEST_NICE];
138
+ sum += kstat_cpu_irqs_sum(i);
139
+ sum += arch_irq_stat_cpu(i);
110140
111141 for (j = 0; j < NR_SOFTIRQS; j++) {
112142 unsigned int softirq_stat = kstat_softirqs_cpu(j, i);
....@@ -130,17 +160,22 @@
130160 seq_putc(p, '\n');
131161
132162 for_each_online_cpu(i) {
163
+ struct kernel_cpustat kcpustat;
164
+ u64 *cpustat = kcpustat.cpustat;
165
+
166
+ kcpustat_cpu_fetch(&kcpustat, i);
167
+
133168 /* Copy values here to work around gcc-2.95.3, gcc-2.96 */
134
- user = kcpustat_cpu(i).cpustat[CPUTIME_USER];
135
- nice = kcpustat_cpu(i).cpustat[CPUTIME_NICE];
136
- system = kcpustat_cpu(i).cpustat[CPUTIME_SYSTEM];
137
- idle = get_idle_time(i);
138
- iowait = get_iowait_time(i);
139
- irq = kcpustat_cpu(i).cpustat[CPUTIME_IRQ];
140
- softirq = kcpustat_cpu(i).cpustat[CPUTIME_SOFTIRQ];
141
- steal = kcpustat_cpu(i).cpustat[CPUTIME_STEAL];
142
- guest = kcpustat_cpu(i).cpustat[CPUTIME_GUEST];
143
- guest_nice = kcpustat_cpu(i).cpustat[CPUTIME_GUEST_NICE];
169
+ user = cpustat[CPUTIME_USER];
170
+ nice = cpustat[CPUTIME_NICE];
171
+ system = cpustat[CPUTIME_SYSTEM];
172
+ idle = get_idle_time(&kcpustat, i);
173
+ iowait = get_iowait_time(&kcpustat, i);
174
+ irq = cpustat[CPUTIME_IRQ];
175
+ softirq = cpustat[CPUTIME_SOFTIRQ];
176
+ steal = cpustat[CPUTIME_STEAL];
177
+ guest = cpustat[CPUTIME_GUEST];
178
+ guest_nice = cpustat[CPUTIME_GUEST_NICE];
144179 seq_printf(p, "cpu%d", i);
145180 seq_put_decimal_ull(p, " ", nsec_to_clock_t(user));
146181 seq_put_decimal_ull(p, " ", nsec_to_clock_t(nice));
....@@ -156,9 +191,7 @@
156191 }
157192 seq_put_decimal_ull(p, "intr ", (unsigned long long)sum);
158193
159
- /* sum again ? it could be updated? */
160
- for_each_irq_nr(j)
161
- seq_put_decimal_ull(p, " ", kstat_irqs_usr(j));
194
+ show_all_irqs(p);
162195
163196 seq_printf(p,
164197 "\nctxt %llu\n"
....@@ -190,16 +223,17 @@
190223 return single_open_size(file, show_stat, NULL, size);
191224 }
192225
193
-static const struct file_operations proc_stat_operations = {
194
- .open = stat_open,
195
- .read = seq_read,
196
- .llseek = seq_lseek,
197
- .release = single_release,
226
+static const struct proc_ops stat_proc_ops = {
227
+ .proc_flags = PROC_ENTRY_PERMANENT,
228
+ .proc_open = stat_open,
229
+ .proc_read_iter = seq_read_iter,
230
+ .proc_lseek = seq_lseek,
231
+ .proc_release = single_release,
198232 };
199233
200234 static int __init proc_stat_init(void)
201235 {
202
- proc_create("stat", 0, NULL, &proc_stat_operations);
236
+ proc_create("stat", 0, NULL, &stat_proc_ops);
203237 return 0;
204238 }
205239 fs_initcall(proc_stat_init);