The patch titled exponential update_wall_time has been removed from the -mm tree. Its filename is exponential-update_wall_time.patch This patch was dropped because it was nacked by the maintainer ------------------------------------------------------ Subject: exponential update_wall_time From: john stultz <johnstul@xxxxxxxxxx> Accumulate time in update_wall_time exponentially. This avoids long running loops seen with the dynticks patch as well as the problematic hang" seen on systems with broken clocksources. Signed-off-by: John Stultz <johnstul@xxxxxxxxxx> Acked-by: Ingo Molnar <mingo@xxxxxxx> Acked-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx> Cc: Roman Zippel <zippel@xxxxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- kernel/timer.c | 28 ++++++++++++++++++++-------- 1 files changed, 20 insertions(+), 8 deletions(-) diff -puN kernel/timer.c~exponential-update_wall_time kernel/timer.c --- a/kernel/timer.c~exponential-update_wall_time +++ a/kernel/timer.c @@ -907,6 +907,7 @@ static void clocksource_adjust(struct cl static void update_wall_time(void) { cycle_t offset; + int shift = 0; /* Make sure we're fully resumed: */ if (unlikely(timekeeping_suspended)) @@ -919,28 +920,39 @@ static void update_wall_time(void) #endif clock->xtime_nsec += (s64)xtime.tv_nsec << clock->shift; + while (offset > clock->cycle_interval << (shift + 1)) + shift++; + /* normally this loop will run just once, however in the * case of lost or late ticks, it will accumulate correctly. */ while (offset >= clock->cycle_interval) { + if (offset < (clock->cycle_interval << shift)) { + shift--; + continue; + } + /* accumulate one interval */ - clock->xtime_nsec += clock->xtime_interval; - clock->cycle_last += clock->cycle_interval; - offset -= clock->cycle_interval; + clock->xtime_nsec += clock->xtime_interval << shift; + clock->cycle_last += clock->cycle_interval << shift; + offset -= clock->cycle_interval << shift; - if (clock->xtime_nsec >= (u64)NSEC_PER_SEC << clock->shift) { + while (clock->xtime_nsec >= (u64)NSEC_PER_SEC << clock->shift) { clock->xtime_nsec -= (u64)NSEC_PER_SEC << clock->shift; xtime.tv_sec++; second_overflow(); } /* interpolator bits */ - time_interpolator_update(clock->xtime_interval - >> clock->shift); + time_interpolator_update((clock->xtime_interval + >> clock->shift)<<shift); /* accumulate error between NTP and clock interval */ - clock->error += current_tick_length(); - clock->error -= clock->xtime_interval << (TICK_LENGTH_SHIFT - clock->shift); + clock->error += current_tick_length() << shift; + clock->error -= (clock->xtime_interval + << (TICK_LENGTH_SHIFT - clock->shift))<<shift; + + shift--; } /* correct the clock when NTP error is too big */ _ Patches currently in -mm which might be from johnstul@xxxxxxxxxx are origin.patch simplify-update_times-avoid-jiffies-jiffies_64-aliasing-problem-2.patch ntp-move-all-the-ntp-related-code-to-ntpc.patch ntp-move-all-the-ntp-related-code-to-ntpc-fix.patch ntp-add-ntp_update_frequency.patch ntp-add-time_adj-to-tick-length.patch ntp-add-time_freq-to-tick-length.patch ntp-prescale-time_offset.patch ntp-add-time_adjust-to-tick-length.patch ntp-remove-time_tolerance.patch ntp-convert-time_freq-to-nsec-value.patch ntp-convert-to-the-ntp4-reference-model.patch ntp-cleanup-defines-and-comments.patch kernel-time-ntpc-possible-cleanups.patch exponential-update_wall_time.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html