diff options
Diffstat (limited to 'kernel/softirq.c')
-rw-r--r-- | kernel/softirq.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/kernel/softirq.c b/kernel/softirq.c index 0cee50487629..56e5dec837f0 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c | |||
@@ -311,9 +311,21 @@ void irq_enter(void) | |||
311 | } | 311 | } |
312 | 312 | ||
313 | #ifdef __ARCH_IRQ_EXIT_IRQS_DISABLED | 313 | #ifdef __ARCH_IRQ_EXIT_IRQS_DISABLED |
314 | # define invoke_softirq() __do_softirq() | 314 | static inline void invoke_softirq(void) |
315 | { | ||
316 | if (!force_irqthreads) | ||
317 | __do_softirq(); | ||
318 | else | ||
319 | wakeup_softirqd(); | ||
320 | } | ||
315 | #else | 321 | #else |
316 | # define invoke_softirq() do_softirq() | 322 | static inline void invoke_softirq(void) |
323 | { | ||
324 | if (!force_irqthreads) | ||
325 | do_softirq(); | ||
326 | else | ||
327 | wakeup_softirqd(); | ||
328 | } | ||
317 | #endif | 329 | #endif |
318 | 330 | ||
319 | /* | 331 | /* |
@@ -737,7 +749,10 @@ static int run_ksoftirqd(void * __bind_cpu) | |||
737 | don't process */ | 749 | don't process */ |
738 | if (cpu_is_offline((long)__bind_cpu)) | 750 | if (cpu_is_offline((long)__bind_cpu)) |
739 | goto wait_to_die; | 751 | goto wait_to_die; |
740 | do_softirq(); | 752 | local_irq_disable(); |
753 | if (local_softirq_pending()) | ||
754 | __do_softirq(); | ||
755 | local_irq_enable(); | ||
741 | preempt_enable_no_resched(); | 756 | preempt_enable_no_resched(); |
742 | cond_resched(); | 757 | cond_resched(); |
743 | preempt_disable(); | 758 | preempt_disable(); |