cregit-Linux how code gets into the kernel

Release 4.17 fs/proc/stat.c

Directory: fs/proc
// SPDX-License-Identifier: GPL-2.0
#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

PersonTokensPropCommitsCommitProp
Martin Schwidefsky4595.74%266.67%
Frédéric Weisbecker24.26%133.33%
Total47100.00%3100.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

PersonTokensPropCommitsCommitProp
Martin Schwidefsky4495.65%266.67%
Frédéric Weisbecker24.35%133.33%
Total46100.00%3100.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

PersonTokensPropCommitsCommitProp
Michal Hocko5079.37%250.00%
Glauber de Oliveira Costa711.11%125.00%
Frédéric Weisbecker69.52%125.00%
Total63100.00%4100.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

PersonTokensPropCommitsCommitProp
Michal Hocko5079.37%250.00%
Glauber de Oliveira Costa711.11%125.00%
Frédéric Weisbecker69.52%125.00%
Total63100.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 ", 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

PersonTokensPropCommitsCommitProp
Alexey Dobriyan34144.87%213.33%
Kamezawa Hiroyuki13818.16%213.33%
Keika Kobayashi9312.24%16.67%
Glauber de Oliveira Costa7810.26%16.67%
Joe Perches263.42%16.67%
Ryota Ozaki263.42%16.67%
Frédéric Weisbecker202.63%16.67%
Russell King141.84%16.67%
Martin Schwidefsky81.05%16.67%
Arnd Bergmann70.92%16.67%
Yinghai Lu40.53%16.67%
Michal Hocko40.53%16.67%
Thomas Gleixner10.13%16.67%
Total760100.00%15100.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 Dobriyan3168.89%125.00%
Eric Dumazet1022.22%125.00%
Heiko Carstens36.67%125.00%
Christoph 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 Dobriyan24100.00%1100.00%
Total24100.00%1100.00%

fs_initcall(proc_stat_init);

Overall Contributors

PersonTokensPropCommitsCommitProp
Alexey Dobriyan48241.80%28.00%
Kamezawa Hiroyuki13811.97%28.00%
Michal Hocko1079.28%28.00%
Martin Schwidefsky1049.02%28.00%
Keika Kobayashi938.07%14.00%
Glauber de Oliveira Costa927.98%14.00%
Frédéric Weisbecker363.12%14.00%
Joe Perches262.25%14.00%
Ryota Ozaki262.25%14.00%
Russell King141.21%14.00%
Eric Dumazet100.87%14.00%
Arnd Bergmann70.61%14.00%
Ingo Molnar40.35%28.00%
Yinghai Lu40.35%14.00%
Heiko Carstens30.26%14.00%
Motohiro Kosaki30.26%14.00%
Greg Kroah-Hartman10.09%14.00%
Paul Gortmaker10.09%14.00%
Christoph Lameter10.09%14.00%
Thomas Gleixner10.09%14.00%
Total1153100.00%25100.00%
Directory: fs/proc
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.