Commit 57d73092 authored by Linus Torvalds's avatar Linus Torvalds

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
parents 050ba07c 5a8e01f8
...@@ -551,10 +551,7 @@ static void cputime_adjust(struct task_cputime *curr, ...@@ -551,10 +551,7 @@ static void cputime_adjust(struct task_cputime *curr,
struct cputime *prev, struct cputime *prev,
cputime_t *ut, cputime_t *st) cputime_t *ut, cputime_t *st)
{ {
cputime_t rtime, stime, utime, total; cputime_t rtime, stime, utime;
stime = curr->stime;
total = stime + curr->utime;
/* /*
* Tick based cputime accounting depend on random scheduling * Tick based cputime accounting depend on random scheduling
...@@ -576,13 +573,19 @@ static void cputime_adjust(struct task_cputime *curr, ...@@ -576,13 +573,19 @@ static void cputime_adjust(struct task_cputime *curr,
if (prev->stime + prev->utime >= rtime) if (prev->stime + prev->utime >= rtime)
goto out; goto out;
if (total) { stime = curr->stime;
utime = curr->utime;
if (utime == 0) {
stime = rtime;
} else if (stime == 0) {
utime = rtime;
} else {
cputime_t total = stime + utime;
stime = scale_stime((__force u64)stime, stime = scale_stime((__force u64)stime,
(__force u64)rtime, (__force u64)total); (__force u64)rtime, (__force u64)total);
utime = rtime - stime; utime = rtime - stime;
} else {
stime = rtime;
utime = 0;
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment