Commit 9dbafa53 authored by Jan Glauber's avatar Jan Glauber Committed by Linus Torvalds

[PATCH] s390: overflow in sched_clock

The least significant bit of the TOD clock value returned by get_clock
is the 4096th part of a microsecond. To get to nanoseconds the value
needs to be divided by 4096 and multiplied with 1000.

The current method multiplies first and then shifts the value to make the
result as precise as possible.  The disadvantage is that the multiplication
with 1000 will overflow shortly after 52 days.  sched_clock is used by the
scheduler for time stamp deltas, if an overflow occurs between two time stamps
the scheduler will get confused.

With the patch the problem occurs only after approx.  one year, so the chance
to run into this overflow is extremly low.
Signed-off-by: default avatarJan Glauber <jan.glauber@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent e018ba1f
...@@ -61,7 +61,7 @@ extern unsigned long wall_jiffies; ...@@ -61,7 +61,7 @@ extern unsigned long wall_jiffies;
*/ */
unsigned long long sched_clock(void) unsigned long long sched_clock(void)
{ {
return ((get_clock() - jiffies_timer_cc) * 1000) >> 12; return ((get_clock() - jiffies_timer_cc) * 125) >> 9;
} }
void tod_to_timeval(__u64 todval, struct timespec *xtime) void tod_to_timeval(__u64 todval, struct timespec *xtime)
......
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