time fix
Linus,
Please pull the latest timers-urgent-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers-urgent-for-linus
HEAD: 1d17d17484d40f2d5b35c79518597a2b25296996 time: Fix adjustment cleanup bug in timekeeping_adjust()
Thanks,
Ingo
------------------>
Ingo Molnar (1):
time: Fix adjustment cleanup bug in timekeeping_adjust()
kernel/time/timekeeping.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-)
kernel/time/timekeeping.c +17 -14
@@ -923,20 +923,22 @@ static void timekeeping_adjust(struct timekeeper *tk, s64 offset)if (likely (error <= interval)) adj =1 ;else - adj =timekeeping_bigadjust (tk, error, &interval, - &offset); - }else if (error < -interval) { -/* See comment above, this is just switched for the negative */ - error >>=2 ; -if (likely (error >= -interval)) { - adj =-1 ; - interval = -interval; - offset = -offset; - }else - adj =timekeeping_bigadjust (tk, error, &interval, - &offset); - }else -return ; + adj =timekeeping_bigadjust (tk, error, &interval, &offset); + }else { +if (error < -interval) { +/* See comment above, this is just switched for the negative */ + error >>=2 ; +if (likely (error >= -interval)) { + adj =-1 ; + interval = -interval; + offset = -offset; + }else { + adj =timekeeping_bigadjust (tk, error, &interval, &offset); + } + }else { + goto out_adjust; + } + }if (unlikely (tk->clock->maxadj && (tk->mult + adj > tk->clock->mult + tk->clock->maxadj))) {
@@ -999,6 +1001,7 @@ static void timekeeping_adjust(struct timekeeper *tk, s64 offset) tk->xtime_nsec -= offset; tk->ntp_error -= (interval - offset) << tk->ntp_error_shift; +out_adjust:/* * It may be possible that when we entered this function, xtime_nsec * was very small. Further, if we're slightly speeding the clocksource