The commit is pushed to "branch-rh7-3.10.0-123.1.2-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git after rh7-3.10.0-123.1.2.vz7.5.9 ------> commit 642aed8e5e5e730e7863cc4c3eb3f1e591dc94e6 Author: Vladimir Davydov <vdavy...@parallels.com> Date: Thu Jun 4 16:58:45 2015 +0400
sched: use cpuacct->cpustat for showing cpu stats In contrast to RH6, where tg->cpustat was used, now cpu stats are accounted in the cpuacct cgroup. So zap tg->cpustat and use cpuacct->cpustat for showing cpu.proc.stat instead. Fortunately cpu and cpuacct cgroups are always mounted together (even by systemd by default), so this will work. Related to https://jira.sw.ru/browse/PSBM-33642 Signed-off-by: Vladimir Davydov <vdavy...@parallels.com> --- kernel/sched/core.c | 22 ++++++++-------------- kernel/sched/cpuacct.c | 5 +++++ kernel/sched/cpuacct.h | 1 + kernel/sched/sched.h | 1 - 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 50273af..d562f64 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -7394,7 +7394,6 @@ void __init sched_init(void) #endif /* CONFIG_CPUMASK_OFFSTACK */ } - root_task_group.cpustat = alloc_percpu(struct kernel_cpustat); root_task_group.taskstats = alloc_percpu(struct taskstats); #ifdef CONFIG_SMP @@ -7695,7 +7694,6 @@ static void free_sched_group(struct task_group *tg) free_fair_sched_group(tg); free_rt_sched_group(tg); autogroup_free(tg); - free_percpu(tg->cpustat); free_percpu(tg->taskstats); kfree(tg); } @@ -7715,10 +7713,6 @@ struct task_group *sched_create_group(struct task_group *parent) if (!alloc_rt_sched_group(tg, parent)) goto err; - tg->cpustat = alloc_percpu(struct kernel_cpustat); - if (!tg->cpustat) - goto err; - tg->taskstats = alloc_percpu(struct taskstats); if (!tg->taskstats) goto err; @@ -8680,11 +8674,12 @@ static u64 cpu_cgroup_usage_cpu(struct task_group *tg, int i) #endif } -static void cpu_cgroup_update_stat(struct task_group *tg, int i) +static void cpu_cgroup_update_stat(struct cgroup *cgrp, int i) { #if defined(CONFIG_SCHEDSTATS) && defined(CONFIG_FAIR_GROUP_SCHED) + struct task_group *tg = cgroup_tg(cgrp); struct sched_entity *se = tg->se[i]; - struct kernel_cpustat *kcpustat = per_cpu_ptr(tg->cpustat, i); + struct kernel_cpustat *kcpustat = cpuacct_cpustat(cgrp, i); u64 now = cpu_clock(i); u64 delta, idle, iowait; @@ -8745,9 +8740,9 @@ int cpu_cgroup_proc_stat(struct cgroup *cgrp, struct cftype *cft, user = nice = system = idle = iowait = steal = 0; for_each_possible_cpu(i) { - kcpustat = per_cpu_ptr(tg->cpustat, i); + kcpustat = cpuacct_cpustat(cgrp, i); - cpu_cgroup_update_stat(tg, i); + cpu_cgroup_update_stat(cgrp, i); user += kcpustat->cpustat[CPUTIME_USER]; nice += kcpustat->cpustat[CPUTIME_NICE]; @@ -8781,7 +8776,7 @@ int cpu_cgroup_proc_stat(struct cgroup *cgrp, struct cftype *cft, for_each_online_cpu(j) { if (j % nr_ve_vcpus != i) continue; - kcpustat = per_cpu_ptr(tg->cpustat, j); + kcpustat = cpuacct_cpustat(cgrp, j); user += kcpustat->cpustat[CPUTIME_USER]; nice += kcpustat->cpustat[CPUTIME_NICE]; @@ -8850,14 +8845,13 @@ int cpu_cgroup_proc_loadavg(struct cgroup *cgrp, struct cftype *cft, void cpu_cgroup_get_stat(struct cgroup *cgrp, struct kernel_cpustat *kstat) { int i, j; - struct task_group *tg = cgroup_tg(cgrp); memset(kstat, 0, sizeof(struct kernel_cpustat)); for_each_possible_cpu(i) { - struct kernel_cpustat *st = per_cpu_ptr(tg->cpustat, i); + struct kernel_cpustat *st = cpuacct_cpustat(cgrp, i); - cpu_cgroup_update_stat(tg, i); + cpu_cgroup_update_stat(cgrp, i); for (j = 0; j < NR_STATS; j++) kstat->cpustat[j] += st->cpustat[j]; diff --git a/kernel/sched/cpuacct.c b/kernel/sched/cpuacct.c index dbb7e2c..b33f7c8 100644 --- a/kernel/sched/cpuacct.c +++ b/kernel/sched/cpuacct.c @@ -286,6 +286,11 @@ void cpuacct_account_field(struct task_struct *p, int index, u64 val) rcu_read_unlock(); } +struct kernel_cpustat *cpuacct_cpustat(struct cgroup *cgrp, int cpu) +{ + return per_cpu_ptr(cgroup_ca(cgrp)->cpustat, cpu); +} + struct cgroup_subsys cpuacct_subsys = { .name = "cpuacct", .css_alloc = cpuacct_css_alloc, diff --git a/kernel/sched/cpuacct.h b/kernel/sched/cpuacct.h index ed60562..cf129ea 100644 --- a/kernel/sched/cpuacct.h +++ b/kernel/sched/cpuacct.h @@ -2,6 +2,7 @@ extern void cpuacct_charge(struct task_struct *tsk, u64 cputime); extern void cpuacct_account_field(struct task_struct *p, int index, u64 val); +extern struct kernel_cpustat *cpuacct_cpustat(struct cgroup *cgrp, int cpu); #else diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index e0c03d8..e4f92a5 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -167,7 +167,6 @@ struct task_group { struct autogroup *autogroup; #endif - struct kernel_cpustat __percpu *cpustat; struct taskstats __percpu *taskstats; unsigned long avenrun[3]; /* loadavg data */ struct timespec start_time; _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel