lkml.org 
[lkml]   [2011]   [Oct]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 03/10] Move /proc/stat logic inside sched.c
    Date
    This patch moves all of the /proc/stat display code inside
    sched.c. The goal is to, later on, have a different version
    of it per-cgroup. In containers environment, this is useful
    to give each container a different and independent view of
    the statistics displayed in this file.

    Signed-off-by: Glauber Costa <glommer@parallels.com>
    ---
    fs/proc/stat.c | 116 +-----------------------------------------------
    include/linux/sched.h | 1 +
    kernel/sched.c | 119 +++++++++++++++++++++++++++++++++++++++++++++++++
    3 files changed, 121 insertions(+), 115 deletions(-)

    diff --git a/fs/proc/stat.c b/fs/proc/stat.c
    index e8e2b39..6b10387 100644
    --- a/fs/proc/stat.c
    +++ b/fs/proc/stat.c
    @@ -11,123 +11,9 @@
    #include <linux/irqnr.h>
    #include <asm/cputime.h>

    -#ifndef arch_irq_stat_cpu
    -#define arch_irq_stat_cpu(cpu) 0
    -#endif
    -#ifndef arch_irq_stat
    -#define arch_irq_stat() 0
    -#endif
    -#ifndef arch_idle_time
    -#define arch_idle_time(cpu) 0
    -#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 += kstat_cpu(i).cpustat[USER];
    - nice += kstat_cpu(i).cpustat[NICE];
    - system += kstat_cpu(i).cpustat[SYSTEM];
    - idle += kstat_cpu(i).cpustat[IDLE];
    - idle += arch_idle_time(i);
    - iowait += kstat_cpu(i).cpustat[IOWAIT];
    - irq += kstat_cpu(i).cpustat[IRQ];
    - softirq += kstat_cpu(i).cpustat[SOFTIRQ];
    - steal += kstat_cpu(i).cpustat[STEAL];
    - guest += kstat_cpu(i).cpustat[GUEST];
    - guest_nice += kstat_cpu(i).cpustat[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_printf(p, "cpu %llu %llu %llu %llu %llu %llu %llu %llu %llu "
    - "%llu\n",
    - (unsigned long long)cputime64_to_clock_t(user),
    - (unsigned long long)cputime64_to_clock_t(nice),
    - (unsigned long long)cputime64_to_clock_t(system),
    - (unsigned long long)cputime64_to_clock_t(idle),
    - (unsigned long long)cputime64_to_clock_t(iowait),
    - (unsigned long long)cputime64_to_clock_t(irq),
    - (unsigned long long)cputime64_to_clock_t(softirq),
    - (unsigned long long)cputime64_to_clock_t(steal),
    - (unsigned long long)cputime64_to_clock_t(guest),
    - (unsigned long long)cputime64_to_clock_t(guest_nice));
    - for_each_online_cpu(i) {
    -
    - /* Copy values here to work around gcc-2.95.3, gcc-2.96 */
    - user = kstat_cpu(i).cpustat[USER];
    - nice = kstat_cpu(i).cpustat[NICE];
    - system = kstat_cpu(i).cpustat[SYSTEM];
    - idle = kstat_cpu(i).cpustat[IDLE];
    - idle += arch_idle_time(i);
    - iowait = kstat_cpu(i).cpustat[IOWAIT];
    - irq = kstat_cpu(i).cpustat[IRQ];
    - softirq = kstat_cpu(i).cpustat[SOFTIRQ];
    - steal = kstat_cpu(i).cpustat[STEAL];
    - guest = kstat_cpu(i).cpustat[GUEST];
    - guest_nice = kstat_cpu(i).cpustat[GUEST_NICE];
    - seq_printf(p,
    - "cpu%d %llu %llu %llu %llu %llu %llu %llu %llu %llu "
    - "%llu\n",
    - i,
    - (unsigned long long)cputime64_to_clock_t(user),
    - (unsigned long long)cputime64_to_clock_t(nice),
    - (unsigned long long)cputime64_to_clock_t(system),
    - (unsigned long long)cputime64_to_clock_t(idle),
    - (unsigned long long)cputime64_to_clock_t(iowait),
    - (unsigned long long)cputime64_to_clock_t(irq),
    - (unsigned long long)cputime64_to_clock_t(softirq),
    - (unsigned long long)cputime64_to_clock_t(steal),
    - (unsigned long long)cputime64_to_clock_t(guest),
    - (unsigned long long)cputime64_to_clock_t(guest_nice));
    - }
    - seq_printf(p, "intr %llu", (unsigned long long)sum);
    -
    - /* sum again ? it could be updated? */
    - for_each_irq_nr(j)
    - seq_printf(p, " %u", kstat_irqs(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_printf(p, " %u", per_softirq_sums[i]);
    - seq_putc(p, '\n');
    -
    - return 0;
    + return cpu_cgroup_proc_stat(p);
    }

    static int stat_open(struct inode *inode, struct file *file)
    diff --git a/include/linux/sched.h b/include/linux/sched.h
    index 4ac2c05..25658d8 100644
    --- a/include/linux/sched.h
    +++ b/include/linux/sched.h
    @@ -2712,6 +2712,7 @@ static inline unsigned long rlimit_max(unsigned int limit)
    return task_rlimit_max(current, limit);
    }

    +int cpu_cgroup_proc_stat(struct seq_file *p);
    #endif /* __KERNEL__ */

    #endif
    diff --git a/kernel/sched.c b/kernel/sched.c
    index 8f0fa05..482e645 100644
    --- a/kernel/sched.c
    +++ b/kernel/sched.c
    @@ -9083,6 +9083,125 @@ struct cgroup_subsys cpu_cgroup_subsys = {

    #endif /* CONFIG_CGROUP_SCHED */

    +#ifndef arch_irq_stat_cpu
    +#define arch_irq_stat_cpu(cpu) 0
    +#endif
    +#ifndef arch_irq_stat
    +#define arch_irq_stat() 0
    +#endif
    +#ifndef arch_idle_time
    +#define arch_idle_time(cpu) 0
    +#endif
    +
    +int cpu_cgroup_proc_stat(struct seq_file *p)
    +{
    + 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 += kstat_this_cpu->cpustat[USER];
    + nice += kstat_this_cpu->cpustat[NICE];
    + system += kstat_this_cpu->cpustat[SYSTEM];
    + idle += kstat_this_cpu->cpustat[IDLE];
    + idle += arch_idle_time(i);
    + iowait += kstat_this_cpu->cpustat[IOWAIT];
    + irq += kstat_this_cpu->cpustat[IRQ];
    + softirq += kstat_this_cpu->cpustat[SOFTIRQ];
    + steal += kstat_this_cpu->cpustat[STEAL];
    + guest += kstat_this_cpu->cpustat[GUEST];
    + guest_nice += kstat_this_cpu->cpustat[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_printf(p, "cpu %llu %llu %llu %llu %llu %llu %llu %llu %llu "
    + "%llu\n",
    + (unsigned long long)cputime64_to_clock_t(user),
    + (unsigned long long)cputime64_to_clock_t(nice),
    + (unsigned long long)cputime64_to_clock_t(system),
    + (unsigned long long)cputime64_to_clock_t(idle),
    + (unsigned long long)cputime64_to_clock_t(iowait),
    + (unsigned long long)cputime64_to_clock_t(irq),
    + (unsigned long long)cputime64_to_clock_t(softirq),
    + (unsigned long long)cputime64_to_clock_t(steal),
    + (unsigned long long)cputime64_to_clock_t(guest),
    + (unsigned long long)cputime64_to_clock_t(guest_nice));
    + for_each_online_cpu(i) {
    +
    + /* Copy values here to work around gcc-2.95.3, gcc-2.96 */
    + user = kstat_this_cpu->cpustat[USER];
    + nice = kstat_this_cpu->cpustat[NICE];
    + system = kstat_this_cpu->cpustat[SYSTEM];
    + idle = kstat_this_cpu->cpustat[IDLE];
    + idle += arch_idle_time(i);
    + iowait = kstat_this_cpu->cpustat[IOWAIT];
    + irq = kstat_this_cpu->cpustat[IRQ];
    + softirq = kstat_this_cpu->cpustat[SOFTIRQ];
    + steal = kstat_this_cpu->cpustat[STEAL];
    + guest = kstat_this_cpu->cpustat[GUEST];
    + guest_nice = kstat_this_cpu->cpustat[GUEST_NICE];
    + seq_printf(p,
    + "cpu%d %llu %llu %llu %llu %llu %llu %llu %llu %llu "
    + "%llu\n",
    + i,
    + (unsigned long long)cputime64_to_clock_t(user),
    + (unsigned long long)cputime64_to_clock_t(nice),
    + (unsigned long long)cputime64_to_clock_t(system),
    + (unsigned long long)cputime64_to_clock_t(idle),
    + (unsigned long long)cputime64_to_clock_t(iowait),
    + (unsigned long long)cputime64_to_clock_t(irq),
    + (unsigned long long)cputime64_to_clock_t(softirq),
    + (unsigned long long)cputime64_to_clock_t(steal),
    + (unsigned long long)cputime64_to_clock_t(guest),
    + (unsigned long long)cputime64_to_clock_t(guest_nice));
    + }
    + seq_printf(p, "intr %llu", (unsigned long long)sum);
    +
    + /* sum again ? it could be updated? */
    + for_each_irq_nr(j)
    + seq_printf(p, " %u", kstat_irqs(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_printf(p, " %u", per_softirq_sums[i]);
    + seq_putc(p, '\n');
    +
    + return 0;
    +}
    +
    #ifdef CONFIG_CGROUP_CPUACCT

    /*
    --
    1.7.6


    \
     
     \ /
      Last update: 2011-10-02 21:25    [W:0.039 / U:93.488 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site