Release 4.11 fs/proc/stat.c
#include <linux/cpumask.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/kernel_stat.h>
#include <linux/proc_fs.h>
#include <linux/sched.h>
#include <linux/sched/stat.h>
#include <linux/seq_file.h>
#include <linux/slab.h>
#include <linux/time.h>
#include <linux/irqnr.h>
#include <linux/sched/cputime.h>
#include <linux/tick.h>
#ifndef arch_irq_stat_cpu
#define arch_irq_stat_cpu(cpu) 0
#endif
#ifndef arch_irq_stat
#define arch_irq_stat() 0
#endif
#ifdef arch_idle_time
static u64 get_idle_time(int cpu)
{
u64 idle;
idle = kcpustat_cpu(cpu).cpustat[CPUTIME_IDLE];
if (cpu_online(cpu) && !nr_iowait_cpu(cpu))
idle += arch_idle_time(cpu);
return idle;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Martin Schwidefsky | 45 | 95.74% | 2 | 66.67% |
Frédéric Weisbecker | 2 | 4.26% | 1 | 33.33% |
Total | 47 | 100.00% | 3 | 100.00% |
static u64 get_iowait_time(int cpu)
{
u64 iowait;
iowait = kcpustat_cpu(cpu).cpustat[CPUTIME_IOWAIT];
if (cpu_online(cpu) && nr_iowait_cpu(cpu))
iowait += arch_idle_time(cpu);
return iowait;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Martin Schwidefsky | 44 | 95.65% | 2 | 66.67% |
Frédéric Weisbecker | 2 | 4.35% | 1 | 33.33% |
Total | 46 | 100.00% | 3 | 100.00% |
#else
static u64 get_idle_time(int cpu)
{
u64 idle, idle_usecs = -1ULL;
if (cpu_online(cpu))
idle_usecs = get_cpu_idle_time_us(cpu, NULL);
if (idle_usecs == -1ULL)
/* !NO_HZ or cpu offline so we can rely on cpustat.idle */
idle = kcpustat_cpu(cpu).cpustat[CPUTIME_IDLE];
else
idle = idle_usecs * NSEC_PER_USEC;
return idle;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Michal Hocko | 50 | 79.37% | 2 | 50.00% |
Glauber de Oliveira Costa | 7 | 11.11% | 1 | 25.00% |
Frédéric Weisbecker | 6 | 9.52% | 1 | 25.00% |
Total | 63 | 100.00% | 4 | 100.00% |
static u64 get_iowait_time(int cpu)
{
u64 iowait, iowait_usecs = -1ULL;
if (cpu_online(cpu))
iowait_usecs = get_cpu_iowait_time_us(cpu, NULL);
if (iowait_usecs == -1ULL)
/* !NO_HZ or cpu offline so we can rely on cpustat.iowait */
iowait = kcpustat_cpu(cpu).cpustat[CPUTIME_IOWAIT];
else
iowait = iowait_usecs * NSEC_PER_USEC;
return iowait;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Michal Hocko | 50 | 79.37% | 2 | 50.00% |
Glauber de Oliveira Costa | 7 | 11.11% | 1 | 25.00% |
Frédéric Weisbecker | 6 | 9.52% | 1 | 25.00% |
Total | 63 | 100.00% | 4 | 100.00% |
#endif
static int show_stat(struct seq_file *p, void *v)
{
int i, j;
u64 user, nice, system, idle, iowait, irq, softirq, steal;
u64 guest, guest_nice;
u64 sum = 0;
u64 sum_softirq = 0;
unsigned int per_softirq_sums[NR_SOFTIRQS] = {0};
struct timespec64 boottime;
user = nice = system = idle = iowait =
irq = softirq = steal = 0;
guest = guest_nice = 0;
getboottime64(&boottime);
for_each_possible_cpu(i) {
user += kcpustat_cpu(i).cpustat[CPUTIME_USER];
nice += kcpustat_cpu(i).cpustat[CPUTIME_NICE];
system += kcpustat_cpu(i).cpustat[CPUTIME_SYSTEM];
idle += get_idle_time(i);
iowait += get_iowait_time(i);
irq += kcpustat_cpu(i).cpustat[CPUTIME_IRQ];
softirq += kcpustat_cpu(i).cpustat[CPUTIME_SOFTIRQ];
steal += kcpustat_cpu(i).cpustat[CPUTIME_STEAL];
guest += kcpustat_cpu(i).cpustat[CPUTIME_GUEST];
guest_nice += kcpustat_cpu(i).cpustat[CPUTIME_GUEST_NICE];
sum += kstat_cpu_irqs_sum(i);
sum += arch_irq_stat_cpu(i);
for (j = 0; j < NR_SOFTIRQS; j++) {
unsigned int softirq_stat = kstat_softirqs_cpu(j, i);
per_softirq_sums[j] += softirq_stat;
sum_softirq += softirq_stat;
}
}
sum += arch_irq_stat();
seq_put_decimal_ull(p, "cpu ", nsec_to_clock_t(user));
seq_put_decimal_ull(p, " ", nsec_to_clock_t(nice));
seq_put_decimal_ull(p, " ", nsec_to_clock_t(system));
seq_put_decimal_ull(p, " ", nsec_to_clock_t(idle));
seq_put_decimal_ull(p, " ", nsec_to_clock_t(iowait));
seq_put_decimal_ull(p, " ", nsec_to_clock_t(irq));
seq_put_decimal_ull(p, " ", nsec_to_clock_t(softirq));
seq_put_decimal_ull(p, " ", nsec_to_clock_t(steal));
seq_put_decimal_ull(p, " ", nsec_to_clock_t(guest));
seq_put_decimal_ull(p, " ", nsec_to_clock_t(guest_nice));
seq_putc(p, '\n');
for_each_online_cpu(i) {
/* Copy values here to work around gcc-2.95.3, gcc-2.96 */
user = kcpustat_cpu(i).cpustat[CPUTIME_USER];
nice = kcpustat_cpu(i).cpustat[CPUTIME_NICE];
system = kcpustat_cpu(i).cpustat[CPUTIME_SYSTEM];
idle = get_idle_time(i);
iowait = get_iowait_time(i);
irq = kcpustat_cpu(i).cpustat[CPUTIME_IRQ];
softirq = kcpustat_cpu(i).cpustat[CPUTIME_SOFTIRQ];
steal = kcpustat_cpu(i).cpustat[CPUTIME_STEAL];
guest = kcpustat_cpu(i).cpustat[CPUTIME_GUEST];
guest_nice = kcpustat_cpu(i).cpustat[CPUTIME_GUEST_NICE];
seq_printf(p, "cpu%d", i);
seq_put_decimal_ull(p, " ", nsec_to_clock_t(user));
seq_put_decimal_ull(p, " ", nsec_to_clock_t(nice));
seq_put_decimal_ull(p, " ", nsec_to_clock_t(system));
seq_put_decimal_ull(p, " ", nsec_to_clock_t(idle));
seq_put_decimal_ull(p, " ", nsec_to_clock_t(iowait));
seq_put_decimal_ull(p, " ", nsec_to_clock_t(irq));
seq_put_decimal_ull(p, " ", nsec_to_clock_t(softirq));
seq_put_decimal_ull(p, " ", nsec_to_clock_t(steal));
seq_put_decimal_ull(p, " ", nsec_to_clock_t(guest));
seq_put_decimal_ull(p, " ", nsec_to_clock_t(guest_nice));
seq_putc(p, '\n');
}
seq_put_decimal_ull(p, "intr ", (unsigned long long)sum);
/* sum again ? it could be updated? */
for_each_irq_nr(j)
seq_put_decimal_ull(p, " ", kstat_irqs_usr(j));
seq_printf(p,
"\nctxt %llu\n"
"btime %llu\n"
"processes %lu\n"
"procs_running %lu\n"
"procs_blocked %lu\n",
nr_context_switches(),
(unsigned long long)boottime.tv_sec,
total_forks,
nr_running(),
nr_iowait());
seq_put_decimal_ull(p, "softirq ", (unsigned long long)sum_softirq);
for (i = 0; i < NR_SOFTIRQS; i++)
seq_put_decimal_ull(p, " ", per_softirq_sums[i]);
seq_putc(p, '\n');
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Alexey Dobriyan | 344 | 45.26% | 2 | 13.33% |
Kamezawa Hiroyuki | 138 | 18.16% | 2 | 13.33% |
Keika Kobayashi | 93 | 12.24% | 1 | 6.67% |
Glauber de Oliveira Costa | 78 | 10.26% | 1 | 6.67% |
Joe Perches | 26 | 3.42% | 1 | 6.67% |
Ryota Ozaki | 26 | 3.42% | 1 | 6.67% |
Frédéric Weisbecker | 20 | 2.63% | 1 | 6.67% |
Russell King | 14 | 1.84% | 1 | 6.67% |
Arnd Bergmann | 7 | 0.92% | 1 | 6.67% |
Martin Schwidefsky | 5 | 0.66% | 1 | 6.67% |
Yinghai Lu | 4 | 0.53% | 1 | 6.67% |
Michal Hocko | 4 | 0.53% | 1 | 6.67% |
Thomas Gleixner | 1 | 0.13% | 1 | 6.67% |
Total | 760 | 100.00% | 15 | 100.00% |
static int stat_open(struct inode *inode, struct file *file)
{
size_t size = 1024 + 128 * num_online_cpus();
/* minimum size to display an interrupt count : 2 bytes */
size += 2 * nr_irqs;
return single_open_size(file, show_stat, NULL, size);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Alexey Dobriyan | 31 | 68.89% | 1 | 25.00% |
Eric Dumazet | 10 | 22.22% | 1 | 25.00% |
Heiko Carstens | 3 | 6.67% | 1 | 25.00% |
Christoph Lameter | 1 | 2.22% | 1 | 25.00% |
Total | 45 | 100.00% | 4 | 100.00% |
static const struct file_operations proc_stat_operations = {
.open = stat_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
};
static int __init proc_stat_init(void)
{
proc_create("stat", 0, NULL, &proc_stat_operations);
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Alexey Dobriyan | 24 | 100.00% | 1 | 100.00% |
Total | 24 | 100.00% | 1 | 100.00% |
fs_initcall(proc_stat_init);
Overall Contributors
Person | Tokens | Prop | Commits | CommitProp |
Alexey Dobriyan | 485 | 42.10% | 2 | 8.33% |
Kamezawa Hiroyuki | 138 | 11.98% | 2 | 8.33% |
Michal Hocko | 107 | 9.29% | 2 | 8.33% |
Martin Schwidefsky | 101 | 8.77% | 2 | 8.33% |
Keika Kobayashi | 93 | 8.07% | 1 | 4.17% |
Glauber de Oliveira Costa | 92 | 7.99% | 1 | 4.17% |
Frédéric Weisbecker | 36 | 3.12% | 1 | 4.17% |
Ryota Ozaki | 26 | 2.26% | 1 | 4.17% |
Joe Perches | 26 | 2.26% | 1 | 4.17% |
Russell King | 14 | 1.22% | 1 | 4.17% |
Eric Dumazet | 10 | 0.87% | 1 | 4.17% |
Arnd Bergmann | 7 | 0.61% | 1 | 4.17% |
Yinghai Lu | 4 | 0.35% | 1 | 4.17% |
Ingo Molnar | 4 | 0.35% | 2 | 8.33% |
Motohiro Kosaki | 3 | 0.26% | 1 | 4.17% |
Heiko Carstens | 3 | 0.26% | 1 | 4.17% |
Thomas Gleixner | 1 | 0.09% | 1 | 4.17% |
Christoph Lameter | 1 | 0.09% | 1 | 4.17% |
Paul Gortmaker | 1 | 0.09% | 1 | 4.17% |
Total | 1152 | 100.00% | 24 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.