diff options
Diffstat (limited to 'kernel/time/tick-sched.c')
| -rw-r--r-- | kernel/time/tick-sched.c | 7 | 
1 files changed, 6 insertions, 1 deletions
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index da70c6db496..86999783392 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c @@ -274,6 +274,7 @@ EXPORT_SYMBOL_GPL(get_cpu_iowait_time_us);  static void tick_nohz_stop_sched_tick(struct tick_sched *ts)  {  	unsigned long seq, last_jiffies, next_jiffies, delta_jiffies; +	unsigned long rcu_delta_jiffies;  	ktime_t last_update, expires, now;  	struct clock_event_device *dev = __get_cpu_var(tick_cpu_device).evtdev;  	u64 time_delta; @@ -322,7 +323,7 @@ static void tick_nohz_stop_sched_tick(struct tick_sched *ts)  		time_delta = timekeeping_max_deferment();  	} while (read_seqretry(&xtime_lock, seq)); -	if (rcu_needs_cpu(cpu) || printk_needs_cpu(cpu) || +	if (rcu_needs_cpu(cpu, &rcu_delta_jiffies) || printk_needs_cpu(cpu) ||  	    arch_needs_cpu(cpu)) {  		next_jiffies = last_jiffies + 1;  		delta_jiffies = 1; @@ -330,6 +331,10 @@ static void tick_nohz_stop_sched_tick(struct tick_sched *ts)  		/* Get the next timer wheel timer */  		next_jiffies = get_next_timer_interrupt(last_jiffies);  		delta_jiffies = next_jiffies - last_jiffies; +		if (rcu_delta_jiffies < delta_jiffies) { +			next_jiffies = last_jiffies + rcu_delta_jiffies; +			delta_jiffies = rcu_delta_jiffies; +		}  	}  	/*  	 * Do not stop the tick, if we are only one off  |