cregit-Linux how code gets into the kernel

Release 4.10 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; 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 ", 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_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

PersonTokensPropCommitsCommitProp
alexey dobriyanalexey dobriyan36247.63%214.29%
kamezawa hiroyukikamezawa hiroyuki13818.16%214.29%
keika kobayashikeika kobayashi9312.24%17.14%
glauber costaglauber costa7810.26%17.14%
ryota ozakiryota ozaki283.68%17.14%
joe perchesjoe perches263.42%17.14%
russell kingrussell king141.84%17.14%
arnd bergmannarnd bergmann70.92%17.14%
martin schwidefskymartin schwidefsky50.66%17.14%
yinghai luyinghai lu40.53%17.14%
michal hockomichal hocko40.53%17.14%
thomas gleixnerthomas gleixner10.13%17.14%
Total760100.00%14100.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 dobriyan50343.70%28.70%
kamezawa hiroyukikamezawa hiroyuki13811.99%28.70%
michal hockomichal hocko11910.34%28.70%
martin schwidefskymartin schwidefsky1059.12%28.70%
keika kobayashikeika kobayashi938.08%14.35%
glauber costaglauber costa927.99%14.35%
ryota ozakiryota ozaki282.43%14.35%
joe perchesjoe perches262.26%14.35%
russell kingrussell king141.22%14.35%
eric dumazeteric dumazet100.87%14.35%
arnd bergmannarnd bergmann70.61%14.35%
yinghai luyinghai lu40.35%14.35%
kosaki motohirokosaki motohiro30.26%14.35%
heiko carstensheiko carstens30.26%14.35%
andreas schwabandreas schwab20.17%14.35%
thomas gleixnerthomas gleixner10.09%14.35%
frederic weisbeckerfrederic weisbecker10.09%14.35%
paul gortmakerpaul gortmaker10.09%14.35%
christoph lameterchristoph lameter10.09%14.35%
Total1151100.00%23100.00%
Directory: fs/proc
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.