Skip to content

Commit a1bc632

Browse files
Zeng Jiahaoshiloong
authored andcommitted
anolis: cpuacct: fix guest cgroup usage more than user usage
OpenAnolis Bug Tracker: 0000532 cgroup cputime was normalized by cpuusage. howerver, guest/guest_nice cputime is not normalized along with user/nice. In the case of running offline rund container will observe the guest cputime is larger than user cputime. Signed-off-by: Zeng Jiahao <[email protected]>
1 parent 9fed83a commit a1bc632

File tree

1 file changed

+21
-2
lines changed

1 file changed

+21
-2
lines changed

kernel/sched/cpuacct.c

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ struct cpuacct_usage {
2626
struct prev_cputime prev_cputime2; /* user and nice */
2727
struct prev_cputime prev_cputime3; /* sys and irq + softirq */
2828
struct prev_cputime prev_cputime4; /* irq and softirq */
29+
struct prev_cputime prev_cputime5; /* (user - guest) and guest */
30+
struct prev_cputime prev_cputime6; /* (nice - guest_nice) and guest_nice */
2931
} ____cacheline_aligned;
3032

3133
#ifdef CONFIG_SCHED_SLI
@@ -411,6 +413,8 @@ static void cpuacct_init(struct cpuacct *ca)
411413
prev_cputime_init(&per_cpu_ptr(ca->cpuusage, i)->prev_cputime2);
412414
prev_cputime_init(&per_cpu_ptr(ca->cpuusage, i)->prev_cputime3);
413415
prev_cputime_init(&per_cpu_ptr(ca->cpuusage, i)->prev_cputime4);
416+
prev_cputime_init(&per_cpu_ptr(ca->cpuusage, i)->prev_cputime5);
417+
prev_cputime_init(&per_cpu_ptr(ca->cpuusage, i)->prev_cputime6);
414418
}
415419

416420
ca->avenrun[0] = ca->avenrun[1] = ca->avenrun[2] = 0;
@@ -960,6 +964,7 @@ static void __cpuacct_get_usage_result(struct cpuacct *ca, int cpu,
960964
struct cpuacct_usage *cpuusage;
961965
struct task_cputime cputime;
962966
u64 tick_user, tick_nice, tick_sys, tick_irq, tick_softirq;
967+
u64 tick_guest, tick_guest_nice;
963968
u64 left, right, left2, right2;
964969
struct sched_entity *se;
965970

@@ -976,6 +981,8 @@ static void __cpuacct_get_usage_result(struct cpuacct *ca, int cpu,
976981
tick_sys = kcpustat->cpustat[CPUTIME_SYSTEM];
977982
tick_irq = kcpustat->cpustat[CPUTIME_IRQ];
978983
tick_softirq = kcpustat->cpustat[CPUTIME_SOFTIRQ];
984+
tick_guest = kcpustat->cpustat[CPUTIME_GUEST];
985+
tick_guest_nice = kcpustat->cpustat[CPUTIME_GUEST_NICE];
979986

980987
/* Calculate system run time */
981988
cputime.sum_exec_runtime = cpuusage->usages[CPUACCT_STAT_USER] +
@@ -1007,6 +1014,20 @@ static void __cpuacct_get_usage_result(struct cpuacct *ca, int cpu,
10071014
res->irq = left;
10081015
res->softirq = right;
10091016

1017+
/* Calculate (user - guest) and guest run time */
1018+
cputime.sum_exec_runtime = res->user; /* user */
1019+
cputime.utime = tick_user - tick_guest;
1020+
cputime.stime = tick_guest;
1021+
cputime_adjust(&cputime, &cpuusage->prev_cputime5, &left, &right);
1022+
res->guest = right;
1023+
1024+
/* Calculate (nice - guest_nice) and guest_nice run time */
1025+
cputime.sum_exec_runtime = res->nice; /* nice */
1026+
cputime.utime = tick_nice - tick_guest_nice;
1027+
cputime.stime = tick_guest_nice;
1028+
cputime_adjust(&cputime, &cpuusage->prev_cputime6, &left, &right);
1029+
res->guest_nice = right;
1030+
10101031
if (se && schedstat_enabled()) {
10111032
unsigned int seq;
10121033
unsigned long flags;
@@ -1045,8 +1066,6 @@ static void __cpuacct_get_usage_result(struct cpuacct *ca, int cpu,
10451066
} else {
10461067
res->idle = res->iowait = res->steal = 0;
10471068
}
1048-
res->guest = kcpustat->cpustat[CPUTIME_GUEST];
1049-
res->guest_nice = kcpustat->cpustat[CPUTIME_GUEST_NICE];
10501069
}
10511070

10521071
static int cpuacct_proc_stats_show(struct seq_file *sf, void *v)

0 commit comments

Comments
 (0)