diff options
Diffstat (limited to 'kernel/softirq.c')
| -rw-r--r-- | kernel/softirq.c | 34 | 
1 files changed, 14 insertions, 20 deletions
diff --git a/kernel/softirq.c b/kernel/softirq.c index 4eb3a0fa351..671f9594e36 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -297,7 +297,7 @@ void irq_enter(void)  	int cpu = smp_processor_id();  	rcu_irq_enter(); -	if (idle_cpu(cpu) && !in_interrupt()) { +	if (is_idle_task(current) && !in_interrupt()) {  		/*  		 * Prevent raise_softirq from needlessly waking up ksoftirqd  		 * here, as softirq will be serviced on return from interrupt. @@ -310,31 +310,21 @@ void irq_enter(void)  	__irq_enter();  } -#ifdef __ARCH_IRQ_EXIT_IRQS_DISABLED  static inline void invoke_softirq(void)  { -	if (!force_irqthreads) +	if (!force_irqthreads) { +#ifdef __ARCH_IRQ_EXIT_IRQS_DISABLED  		__do_softirq(); -	else { -		__local_bh_disable((unsigned long)__builtin_return_address(0), -				SOFTIRQ_OFFSET); -		wakeup_softirqd(); -		__local_bh_enable(SOFTIRQ_OFFSET); -	} -}  #else -static inline void invoke_softirq(void) -{ -	if (!force_irqthreads)  		do_softirq(); -	else { +#endif +	} else {  		__local_bh_disable((unsigned long)__builtin_return_address(0),  				SOFTIRQ_OFFSET);  		wakeup_softirqd();  		__local_bh_enable(SOFTIRQ_OFFSET);  	}  } -#endif  /*   * Exit an interrupt context. Process softirqs if needed and possible: @@ -353,7 +343,7 @@ void irq_exit(void)  		tick_nohz_irq_exit();  #endif  	rcu_irq_exit(); -	preempt_enable_no_resched(); +	sched_preempt_enable_no_resched();  }  /* @@ -385,6 +375,12 @@ void raise_softirq(unsigned int nr)  	local_irq_restore(flags);  } +void __raise_softirq_irqoff(unsigned int nr) +{ +	trace_softirq_raise(nr); +	or_softirq_pending(1UL << nr); +} +  void open_softirq(int nr, void (*action)(struct softirq_action *))  {  	softirq_vec[nr].action = action; @@ -744,9 +740,7 @@ static int run_ksoftirqd(void * __bind_cpu)  	while (!kthread_should_stop()) {  		preempt_disable();  		if (!local_softirq_pending()) { -			preempt_enable_no_resched(); -			schedule(); -			preempt_disable(); +			schedule_preempt_disabled();  		}  		__set_current_state(TASK_RUNNING); @@ -761,7 +755,7 @@ static int run_ksoftirqd(void * __bind_cpu)  			if (local_softirq_pending())  				__do_softirq();  			local_irq_enable(); -			preempt_enable_no_resched(); +			sched_preempt_enable_no_resched();  			cond_resched();  			preempt_disable();  			rcu_note_context_switch((long)__bind_cpu);  |