|
@@ -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
|
|
|
}
|
|
|
|
|
|
/*
|