diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-05 15:36:46 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-05 15:36:46 -0400 |
| commit | 57d730924d5cc2c3e280af16a9306587c3a511db (patch) | |
| tree | 78e4c6386f40bdaa1c3a9af869bcdc9b1a52818c /kernel | |
| parent | 050ba07cdc9aaef17e1be251aa8fceb9a919d5d3 (diff) | |
| parent | 5a8e01f8fa51f5cbce8f37acc050eb2319d12956 (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.c | 19 |
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 | /* |
