cregit-Linux how code gets into the kernel

Release 4.7 fs/proc/stat.c

Directory: fs/proc
#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/seq_file.h>
#include <linux/slab.h>
#include <linux/time.h>
#include <linux/irqnr.h>
#include <linux/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 cputime64_t get_idle_time(int cpu) { cputime64_t idle; idle = kcpustat_cpu(cpu).cpustat[CPUTIME_IDLE]; if (cpu_online(cpu) && !nr_iowait_cpu(cpu)) idle += arch_idle_time(cpu); return idle; }

Contributors

PersonTokensPropCommitsCommitProp
martin schwidefskymartin schwidefsky47100.00%2100.00%
Total47100.00%2100.00%


static cputime64_t get_iowait_time(int cpu) { cputime64_t iowait; iowait = kcpustat_cpu(cpu).cpustat[CPUTIME_IOWAIT]; if (cpu_online(cpu) && nr_iowait_cpu(cpu)) iowait += arch_idle_time(cpu); return iowait; }

Contributors

PersonTokensPropCommitsCommitProp
martin schwidefskymartin schwidefsky46100.00%2100.00%
Total46100.00%2100.00%

#else
static u64 get_idle_time(int cpu) { u64 idle, idle_time = -1ULL; if (cpu_online(cpu)) idle_time = get_cpu_idle_time_us(cpu, NULL); if (idle_time == -1ULL) /* !NO_HZ or cpu offline so we can rely on cpustat.idle */ idle = kcpustat_cpu(cpu).cpustat[CPUTIME_IDLE]; else idle = usecs_to_cputime64(idle_time); return idle; }

Contributors

PersonTokensPropCommitsCommitProp
michal hockomichal hocko5687.50%250.00%
glauber costaglauber costa710.94%125.00%
andreas schwabandreas schwab11.56%125.00%
Total64100.00%4100.00%


static u64 get_iowait_time(int cpu) { u64 iowait, iowait_time = -1ULL; if (cpu_online(cpu)) iowait_time = get_cpu_iowait_time_us(cpu, NULL); if (iowait_time == -1ULL) /* !NO_HZ or cpu offline so we can rely on cpustat.iowait */ iowait = kcpustat_cpu(cpu).cpustat[CPUTIME_IOWAIT]; else iowait = usecs_to_cputime64(iowait_time); return iowait; }

Contributors

PersonTokensPropCommitsCommitProp
michal hockomichal hocko5687.50%250.00%
glauber costaglauber costa710.94%125.00%
andreas schwabandreas schwab11.56%125.00%
Total64100.00%4100.00%

#endif
static int show_stat(struct seq_file *p, void *v) { int i, j; unsigned long jif; 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 timespec boottime; user = nice = system = idle = iowait = irq = softirq = steal = 0; guest = guest_nice = 0; getboottime(&boottime); jif = boottime.tv_sec; 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_puts(p, "cpu "); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(user)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(nice)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(system)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(idle)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(iowait)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(irq)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(softirq)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(steal)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(guest)); seq_put_decimal_ull(p, ' ', cputime64_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, ' ', cputime64_to_clock_t(user)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(nice)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(system)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(idle)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(iowait)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(irq)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(softirq)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(steal)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(guest)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(guest_nice)); seq_putc(p, '\n'); } seq_printf(p, "intr %llu", (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 %lu\n" "processes %lu\n" "procs_running %lu\n" "procs_blocked %lu\n", nr_context_switches(), (unsigned long)jif, total_forks, nr_running(), nr_iowait()); seq_printf(p, "softirq %llu", (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

PersonTokensPropCommitsCommitProp
alexey dobriyanalexey dobriyan38149.22%216.67%
kamezawa hiroyukikamezawa hiroyuki16421.19%216.67%
keika kobayashikeika kobayashi9512.27%18.33%
glauber costaglauber costa7810.08%18.33%
ryota ozakiryota ozaki283.62%18.33%
russell kingrussell king141.81%18.33%
martin schwidefskymartin schwidefsky50.65%18.33%
michal hockomichal hocko40.52%18.33%
yinghai luyinghai lu40.52%18.33%
thomas gleixnerthomas gleixner10.13%18.33%
Total774100.00%12100.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

PersonTokensPropCommitsCommitProp
alexey dobriyanalexey dobriyan3168.89%125.00%
eric dumazeteric dumazet1022.22%125.00%
heiko carstensheiko carstens36.67%125.00%
christoph lameterchristoph lameter12.22%125.00%
Total45100.00%4100.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

PersonTokensPropCommitsCommitProp
alexey dobriyanalexey dobriyan24100.00%1100.00%
Total24100.00%1100.00%

fs_initcall(proc_stat_init);

Overall Contributors

PersonTokensPropCommitsCommitProp
alexey dobriyanalexey dobriyan52244.81%29.52%
kamezawa hiroyukikamezawa hiroyuki16414.08%29.52%
michal hockomichal hocko11910.21%29.52%
martin schwidefskymartin schwidefsky1059.01%29.52%
keika kobayashikeika kobayashi958.15%14.76%
glauber costaglauber costa927.90%14.76%
ryota ozakiryota ozaki282.40%14.76%
russell kingrussell king141.20%14.76%
eric dumazeteric dumazet100.86%14.76%
yinghai luyinghai lu40.34%14.76%
kosaki motohirokosaki motohiro30.26%14.76%
heiko carstensheiko carstens30.26%14.76%
andreas schwabandreas schwab20.17%14.76%
frederic weisbeckerfrederic weisbecker10.09%14.76%
paul gortmakerpaul gortmaker10.09%14.76%
christoph lameterchristoph lameter10.09%14.76%
thomas gleixnerthomas gleixner10.09%14.76%
Total1165100.00%21100.00%
Directory: fs/proc
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
{% endraw %}