From 7996c7542d3ff160f4a0d7cb613b09fa40db7477 Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Tue, 19 Jul 2011 15:32:00 -0700 Subject: [PATCH] --- yaml --- r: 255023 b: refs/heads/master c: ec433f0c51527426989ea8a38a856d810d739414 h: refs/heads/master i: 255021: 401eb0b00c0ec187fe50463c33e5a3ce69d03048 255019: 049f51a11c6fab0bdb4304470ee8e7d6f87bebde 255015: 00bce0d0e99adab85cf80c5313d757ccccd583f8 255007: a3805db65a15a271b41d44709cfdf7cba6acb420 v: v3 --- [refs] | 2 +- trunk/kernel/rcutree_plugin.h | 2 +- trunk/kernel/softirq.c | 12 ++++++++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 8471958d494f..cdc183d93d2d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: c5d753a55ac92e09816d410cd17093813f1a904b +refs/heads/master: ec433f0c51527426989ea8a38a856d810d739414 diff --git a/trunk/kernel/rcutree_plugin.h b/trunk/kernel/rcutree_plugin.h index d9d7a89da8bb..8aafbb80b8b0 100644 --- a/trunk/kernel/rcutree_plugin.h +++ b/trunk/kernel/rcutree_plugin.h @@ -318,7 +318,7 @@ static noinline void rcu_read_unlock_special(struct task_struct *t) } /* Hardware IRQ handlers cannot block. */ - if (in_irq()) { + if (in_irq() || in_serving_softirq()) { local_irq_restore(flags); return; } diff --git a/trunk/kernel/softirq.c b/trunk/kernel/softirq.c index 40cf63ddd4b3..fca82c32042b 100644 --- a/trunk/kernel/softirq.c +++ b/trunk/kernel/softirq.c @@ -315,16 +315,24 @@ static inline void invoke_softirq(void) { if (!force_irqthreads) __do_softirq(); - else + 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 + else { + __local_bh_disable((unsigned long)__builtin_return_address(0), + SOFTIRQ_OFFSET); wakeup_softirqd(); + __local_bh_enable(SOFTIRQ_OFFSET); + } } #endif