diff options
Diffstat (limited to 'kernel/softirq.c')
| -rw-r--r-- | kernel/softirq.c | 19 | 
1 files changed, 14 insertions, 5 deletions
diff --git a/kernel/softirq.c b/kernel/softirq.c index aa82723c720..b5197dcb0da 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -329,6 +329,19 @@ static inline void invoke_softirq(void)  		wakeup_softirqd();  } +static inline void tick_irq_exit(void) +{ +#ifdef CONFIG_NO_HZ_COMMON +	int cpu = smp_processor_id(); + +	/* Make sure that timer wheel updates are propagated */ +	if ((idle_cpu(cpu) && !need_resched()) || tick_nohz_full_cpu(cpu)) { +		if (!in_interrupt()) +			tick_nohz_irq_exit(); +	} +#endif +} +  /*   * Exit an interrupt context. Process softirqs if needed and possible:   */ @@ -346,11 +359,7 @@ void irq_exit(void)  	if (!in_interrupt() && local_softirq_pending())  		invoke_softirq(); -#ifdef CONFIG_NO_HZ -	/* Make sure that timer wheel updates are propagated */ -	if (idle_cpu(smp_processor_id()) && !in_interrupt() && !need_resched()) -		tick_nohz_irq_exit(); -#endif +	tick_irq_exit();  	rcu_irq_exit();  }  |