| From e75e863dd5c7d96b91ebbd241da5328fc38a78cc Mon Sep 17 00:00:00 2001 |
| From: Stanislaw Gruszka <sgruszka@redhat.com> |
| Date: Tue, 14 Sep 2010 16:35:14 +0200 |
| Subject: sched: Fix user time incorrectly accounted as system time on 32-bit |
| |
| From: Stanislaw Gruszka <sgruszka@redhat.com> |
| |
| commit e75e863dd5c7d96b91ebbd241da5328fc38a78cc upstream. |
| |
| We have 32-bit variable overflow possibility when multiply in |
| task_times() and thread_group_times() functions. When the |
| overflow happens then the scaled utime value becomes erroneously |
| small and the scaled stime becomes i erroneously big. |
| |
| Reported here: |
| |
| https://bugzilla.redhat.com/show_bug.cgi?id=633037 |
| https://bugzilla.kernel.org/show_bug.cgi?id=16559 |
| |
| Reported-by: Michael Chapman <redhat-bugzilla@very.puzzling.org> |
| Reported-by: Ciriaco Garcia de Celis <sysman@etherpilot.com> |
| Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> |
| Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> |
| Cc: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com> |
| LKML-Reference: <20100914143513.GB8415@redhat.com> |
| Signed-off-by: Ingo Molnar <mingo@elte.hu> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| kernel/sched.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/kernel/sched.c |
| +++ b/kernel/sched.c |
| @@ -5341,9 +5341,9 @@ void thread_group_times(struct task_stru |
| rtime = nsecs_to_cputime(cputime.sum_exec_runtime); |
| |
| if (total) { |
| - u64 temp; |
| + u64 temp = rtime; |
| |
| - temp = (u64)(rtime * cputime.utime); |
| + temp *= cputime.utime; |
| do_div(temp, total); |
| utime = (cputime_t)temp; |
| } else |