diff --git a/kernel/softirq.c b/kernel/softirq.c index a5e1c8cc968d97f447947d98c24f0fe7b91c18f5..a33127229cacedfb66c7c07d349f3f430f28d744 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -654,13 +654,12 @@ static inline void __irq_exit_rcu(void) #endif account_hardirq_exit(current); preempt_count_sub(HARDIRQ_OFFSET); - if (!in_interrupt()) { - if (local_softirq_pending()) - invoke_softirq(); + if (!in_interrupt() && local_softirq_pending()) + invoke_softirq(); - if (IS_ENABLED(CONFIG_PREEMPT_RT) && local_pending_timers()) - wake_timersd(); - } + if (IS_ENABLED(CONFIG_PREEMPT_RT) && local_pending_timers() && + !(in_nmi() | in_hardirq())) + wake_timersd(); tick_irq_exit(); }