diff options
Diffstat (limited to 'kernel/softirq.c')
| -rw-r--r-- | kernel/softirq.c | 21 | 
1 files changed, 9 insertions, 12 deletions
diff --git a/kernel/softirq.c b/kernel/softirq.c index b4d252fd195..14d7758074a 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -323,18 +323,10 @@ void irq_enter(void)  static inline void invoke_softirq(void)  { -	if (!force_irqthreads) { -#ifdef __ARCH_IRQ_EXIT_IRQS_DISABLED +	if (!force_irqthreads)  		__do_softirq(); -#else -		do_softirq(); -#endif -	} else { -		__local_bh_disable((unsigned long)__builtin_return_address(0), -				SOFTIRQ_OFFSET); +	else  		wakeup_softirqd(); -		__local_bh_enable(SOFTIRQ_OFFSET); -	}  }  /* @@ -342,9 +334,15 @@ static inline void invoke_softirq(void)   */  void irq_exit(void)  { +#ifndef __ARCH_IRQ_EXIT_IRQS_DISABLED +	local_irq_disable(); +#else +	WARN_ON_ONCE(!irqs_disabled()); +#endif +  	account_irq_exit_time(current);  	trace_hardirq_exit(); -	sub_preempt_count(IRQ_EXIT_OFFSET); +	sub_preempt_count(HARDIRQ_OFFSET);  	if (!in_interrupt() && local_softirq_pending())  		invoke_softirq(); @@ -354,7 +352,6 @@ void irq_exit(void)  		tick_nohz_irq_exit();  #endif  	rcu_irq_exit(); -	sched_preempt_enable_no_resched();  }  /*  |