aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Glauber <jan.glauber@de.ibm.com>2006-02-01 06:06:32 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-02-01 11:53:23 -0500
commit9dbafa5368c2b7467bd2ce034b56c54908ceb39e (patch)
tree9fb8feeb1328a76b8760339de374997b14e9a3a4
parente018ba1fceee5bd306e31f6e3a60934d5f143ac5 (diff)
[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: Jan Glauber <jan.glauber@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--arch/s390/kernel/time.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c
index 7c0fe152a111..efba91b015be 100644
--- a/arch/s390/kernel/time.c
+++ b/arch/s390/kernel/time.c
@@ -61,7 +61,7 @@ extern unsigned long wall_jiffies;
61 */ 61 */
62unsigned long long sched_clock(void) 62unsigned long long sched_clock(void)
63{ 63{
64 return ((get_clock() - jiffies_timer_cc) * 1000) >> 12; 64 return ((get_clock() - jiffies_timer_cc) * 125) >> 9;
65} 65}
66 66
67void tod_to_timeval(__u64 todval, struct timespec *xtime) 67void tod_to_timeval(__u64 todval, struct timespec *xtime)