lkml.org 
[lkml]   [2016]   [Mar]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 3/4] cpuacct: Show possible_cpu in cpuacct
    Date
    Current code show stats of online cpus in cpuacct.statcpus,
    show stats of present cpus in cpuacct.usage(_percpu), and using
    present cpus for setting cpuacct.usage.

    It will cause inconsistent result when a cpu is online or offline
    or hotpluged.

    We should always use possible cpus to avoid above problem.

    Content of cpuacct.usage_percpu changed after this patch:
    (On a 4 cpu system with maxcpus=32)
    Before patch:
    # cat cpuacct.usage_percpu
    2456565 411435 1052897 832584
    After patch:
    # cat cpuacct.usage_percpu
    2456565 411435 1052897 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    Suggested-by: Peter Zijlstra <peterz@infradead.org>
    Signed-off-by: Zhao Lei <zhaolei@cn.fujitsu.com>
    ---
    kernel/sched/cpuacct.c | 10 +++++-----
    1 file changed, 5 insertions(+), 5 deletions(-)

    diff --git a/kernel/sched/cpuacct.c b/kernel/sched/cpuacct.c
    index 434c2fa..4399850 100644
    --- a/kernel/sched/cpuacct.c
    +++ b/kernel/sched/cpuacct.c
    @@ -138,7 +138,7 @@ static u64 cpuusage_read(struct cgroup_subsys_state *css, struct cftype *cft)
    u64 totalcpuusage = 0;
    int i;

    - for_each_present_cpu(i)
    + for_each_possible_cpu(i)
    totalcpuusage += cpuacct_cpuusage_read(ca, i);

    return totalcpuusage;
    @@ -159,7 +159,7 @@ static int cpuusage_write(struct cgroup_subsys_state *css, struct cftype *cft,
    goto out;
    }

    - for_each_present_cpu(i)
    + for_each_possible_cpu(i)
    cpuacct_cpuusage_write(ca, i, 0);

    out:
    @@ -172,7 +172,7 @@ static int cpuacct_percpu_seq_show(struct seq_file *m, void *V)
    u64 percpu;
    int i;

    - for_each_present_cpu(i) {
    + for_each_possible_cpu(i) {
    percpu = cpuacct_cpuusage_read(ca, i);
    seq_printf(m, "%llu ", (unsigned long long) percpu);
    }
    @@ -191,7 +191,7 @@ static int cpuacct_stats_show(struct seq_file *sf, void *v)
    int cpu;
    s64 val = 0;

    - for_each_online_cpu(cpu) {
    + for_each_possible_cpu(cpu) {
    struct kernel_cpustat *kcpustat = per_cpu_ptr(ca->cpustat, cpu);
    val += kcpustat->cpustat[CPUTIME_USER];
    val += kcpustat->cpustat[CPUTIME_NICE];
    @@ -200,7 +200,7 @@ static int cpuacct_stats_show(struct seq_file *sf, void *v)
    seq_printf(sf, "%s %lld\n", cpuacct_stat_desc[CPUACCT_STAT_USER], val);

    val = 0;
    - for_each_online_cpu(cpu) {
    + for_each_possible_cpu(cpu) {
    struct kernel_cpustat *kcpustat = per_cpu_ptr(ca->cpustat, cpu);
    val += kcpustat->cpustat[CPUTIME_SYSTEM];
    val += kcpustat->cpustat[CPUTIME_IRQ];
    --
    1.8.5.1


    \
     
     \ /
      Last update: 2016-03-22 10:21    [W:3.014 / U:0.228 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site