Messages in this thread Patch in this message | | | From | Liav Rehana <> | Subject | [PATCH] Fix chance of sign extension to nsec after its msb is set during calculation. | Date | Thu, 1 Sep 2016 14:14:38 +0300 |
| |
From: Liav Rehana <liavr@mellanox.com>
During the calculation of the nsec variable, "delta * tkr->mult" may cause overflow to the msb, if the suspended time is too long. In that case, we need to guarantee that the variable will not go through a sign extension during its shift, and thus it will result in a much higher value - close to the larget value of 64 bits. The following commit fixes this problem, which causes the following bug: Trying to connect through ftp to the os after a long enough suspended time will cause the nsec variable to get a much higher value after its shift because of sign extension, and thus the loop that follows some instructions afterwards, implemented in the inline function __iter_div_u64_rem, will take too long.
Signed-off-by: Liav Rehana <liavr@mellanox.com> --- kernel/time/timekeeping.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 479d25c..ddf56a5 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c @@ -305,7 +305,7 @@ static inline s64 timekeeping_delta_to_ns(struct tk_read_base *tkr, s64 nsec; nsec = delta * tkr->mult + tkr->xtime_nsec; - nsec >>= tkr->shift; + nsec = ((u64) nsec) >> tkr->shift; /* If arch requires, add in get_arch_timeoffset() */ return nsec + arch_gettimeoffset(); -- 1.7.1
| |