aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-09-05 15:36:46 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-09-05 15:36:46 -0400
commit57d730924d5cc2c3e280af16a9306587c3a511db (patch)
tree78e4c6386f40bdaa1c3a9af869bcdc9b1a52818c /kernel
parent050ba07cdc9aaef17e1be251aa8fceb9a919d5d3 (diff)
parent5a8e01f8fa51f5cbce8f37acc050eb2319d12956 (diff)
Merge branch 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull cputime fix from Ingo Molnar: "This fixes a longer-standing cputime accounting bug that Stanislaw Gruszka finally managed to track down" * 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: sched/cputime: Do not scale when utime == 0
Diffstat (limited to 'kernel')
-rw-r--r--kernel/sched/cputime.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c
index ace34f95e200..99947919e30b 100644
--- a/kernel/sched/cputime.c
+++ b/kernel/sched/cputime.c
@@ -551,10 +551,7 @@ static void cputime_adjust(struct task_cputime *curr,
551 struct cputime *prev, 551 struct cputime *prev,
552 cputime_t *ut, cputime_t *st) 552 cputime_t *ut, cputime_t *st)
553{ 553{
554 cputime_t rtime, stime, utime, total; 554 cputime_t rtime, stime, utime;
555
556 stime = curr->stime;
557 total = stime + curr->utime;
558 555
559 /* 556 /*
560 * Tick based cputime accounting depend on random scheduling 557 * Tick based cputime accounting depend on random scheduling
@@ -576,13 +573,19 @@ static void cputime_adjust(struct task_cputime *curr,
576 if (prev->stime + prev->utime >= rtime) 573 if (prev->stime + prev->utime >= rtime)
577 goto out; 574 goto out;
578 575
579 if (total) { 576 stime = curr->stime;
577 utime = curr->utime;
578
579 if (utime == 0) {
580 stime = rtime;
581 } else if (stime == 0) {
582 utime = rtime;
583 } else {
584 cputime_t total = stime + utime;
585
580 stime = scale_stime((__force u64)stime, 586 stime = scale_stime((__force u64)stime,
581 (__force u64)rtime, (__force u64)total); 587 (__force u64)rtime, (__force u64)total);
582 utime = rtime - stime; 588 utime = rtime - stime;
583 } else {
584 stime = rtime;
585 utime = 0;
586 } 589 }
587 590
588 /* 591 /*