diff options
Diffstat (limited to 'kernel/time')
| -rw-r--r-- | kernel/time/timer.c | 14 | 
1 files changed, 9 insertions, 5 deletions
| diff --git a/kernel/time/timer.c b/kernel/time/timer.c index ccf913038f9f..7c446fb5163a 100644 --- a/kernel/time/timer.c +++ b/kernel/time/timer.c @@ -1523,12 +1523,16 @@ u64 get_next_timer_interrupt(unsigned long basej, u64 basem)  	is_max_delta = (nextevt == base->clk + NEXT_TIMER_MAX_DELTA);  	base->next_expiry = nextevt;  	/* -	 * We have a fresh next event. Check whether we can forward the base: +	 * We have a fresh next event. Check whether we can forward the +	 * base. We can only do that when @basej is past base->clk +	 * otherwise we might rewind base->clk.  	 */ -	if (time_after(nextevt, jiffies)) -		base->clk = jiffies; -	else if (time_after(nextevt, base->clk)) -		base->clk = nextevt; +	if (time_after(basej, base->clk)) { +		if (time_after(nextevt, basej)) +			base->clk = basej; +		else if (time_after(nextevt, base->clk)) +			base->clk = nextevt; +	}  	if (time_before_eq(nextevt, basej)) {  		expires = basem; | 
