From a940d8c722d57ecd12474b035996670535286b8d Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Wed, 20 Feb 2013 22:00:48 +0100 Subject: [PATCH] --- yaml --- r: 360756 b: refs/heads/master c: 74eed0163d0def3fce27228d9ccf3d36e207b286 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/kernel/softirq.c | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index f0284e361939..7b55f6af9fa0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e5ab012c3271990e8457055c25cafddc1ae8aa6b +refs/heads/master: 74eed0163d0def3fce27228d9ccf3d36e207b286 diff --git a/trunk/kernel/softirq.c b/trunk/kernel/softirq.c index f5cc25f147a6..f2a934673008 100644 --- a/trunk/kernel/softirq.c +++ b/trunk/kernel/softirq.c @@ -341,6 +341,14 @@ static inline void invoke_softirq(void) */ void irq_exit(void) { +#ifndef __ARCH_IRQ_EXIT_IRQS_DISABLED + unsigned long flags; + + local_irq_save(flags); +#else + WARN_ON_ONCE(!irqs_disabled()); +#endif + account_irq_exit_time(current); trace_hardirq_exit(); sub_preempt_count(IRQ_EXIT_OFFSET); @@ -354,6 +362,9 @@ void irq_exit(void) #endif rcu_irq_exit(); sched_preempt_enable_no_resched(); +#ifndef __ARCH_IRQ_EXIT_IRQS_DISABLED + local_irq_restore(flags); +#endif } /*