diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/timer.c | 39 | 
1 files changed, 34 insertions, 5 deletions
| diff --git a/kernel/timer.c b/kernel/timer.c index b9dad3994676..fe3a9a9f8328 100644 --- a/kernel/timer.c +++ b/kernel/timer.c @@ -717,12 +717,16 @@ static void second_overflow(void)  #endif  } -/* in the NTP reference this is called "hardclock()" */ -static void update_wall_time_one_tick(void) +/* + * Returns how many microseconds we need to add to xtime this tick + * in doing an adjustment requested with adjtime. + */ +static long adjtime_adjustment(void)  { -	long time_adjust_step, delta_nsec; +	long time_adjust_step; -	if ((time_adjust_step = time_adjust) != 0 ) { +	time_adjust_step = time_adjust; +	if (time_adjust_step) {  		/*  		 * We are doing an adjtime thing.  Prepare time_adjust_step to  		 * be within bounds.  Note that a positive time_adjust means we @@ -733,10 +737,19 @@ static void update_wall_time_one_tick(void)  		 */  		time_adjust_step = min(time_adjust_step, (long)tickadj);  		time_adjust_step = max(time_adjust_step, (long)-tickadj); +	} +	return time_adjust_step; +} +/* in the NTP reference this is called "hardclock()" */ +static void update_wall_time_one_tick(void) +{ +	long time_adjust_step, delta_nsec; + +	time_adjust_step = adjtime_adjustment(); +	if (time_adjust_step)  		/* Reduce by this step the amount of time left  */  		time_adjust -= time_adjust_step; -	}  	delta_nsec = tick_nsec + time_adjust_step * 1000;  	/*  	 * Advance the phase, once it gets to one microsecond, then @@ -759,6 +772,22 @@ static void update_wall_time_one_tick(void)  }  /* + * Return how long ticks are at the moment, that is, how much time + * update_wall_time_one_tick will add to xtime next time we call it + * (assuming no calls to do_adjtimex in the meantime). + * The return value is in fixed-point nanoseconds with SHIFT_SCALE-10 + * bits to the right of the binary point. + * This function has no side-effects. + */ +u64 current_tick_length(void) +{ +	long delta_nsec; + +	delta_nsec = tick_nsec + adjtime_adjustment() * 1000; +	return ((u64) delta_nsec << (SHIFT_SCALE - 10)) + time_adj; +} + +/*   * Using a loop looks inefficient, but "ticks" is   * usually just one (we shouldn't be losing ticks,   * we're doing this this way mainly for interrupt | 
