Commit 767f3021 authored by Henrik Austad's avatar Henrik Austad Committed by Chris Metcalf

tile: avoid overflow in ns2cycles

In commit 4cecf6d4 ("sched, x86: Avoid unnecessary overflow in
sched_clock") and in recent patch "clocksource: avoid unnecessary
overflow in cyclecounter_cyc2ns()" https://lkml.org/lkml/2014/3/4/17,
the mult-shift approach is replaced by 2 steps to avoid storing a large,
intermediate value that could overflow.

arch/tile/kernel/time.c has a similar pattern in cycles2ns, and this
copies the same pattern in this function

CC: John Stultz <johnstul@us.ibm.com>
CC: Mike Galbraith <bitbucket@online.de>
CC: Salman Qazi <sqazi@google.com>
Signed-off-by: default avatarHenrik Austad <henrik@austad.us>
Signed-off-by: default avatarChris Metcalf <cmetcalf@tilera.com>
parent 0414855f
...@@ -236,7 +236,15 @@ cycles_t ns2cycles(unsigned long nsecs) ...@@ -236,7 +236,15 @@ cycles_t ns2cycles(unsigned long nsecs)
* clock frequency. * clock frequency.
*/ */
struct clock_event_device *dev = &__raw_get_cpu_var(tile_timer); struct clock_event_device *dev = &__raw_get_cpu_var(tile_timer);
return ((u64)nsecs * dev->mult) >> dev->shift;
/*
* as in clocksource.h and x86's timer.h, we split the calculation
* into 2 parts to avoid unecessary overflow of the intermediate
* value. This will not lead to any loss of precision.
*/
u64 quot = (u64)nsecs >> dev->shift;
u64 rem = (u64)nsecs & ((1ULL << dev->shift) - 1);
return quot * dev->mult + ((rem * dev->mult) >> dev->shift);
} }
void update_vsyscall_tz(void) void update_vsyscall_tz(void)
......
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