From: "shiyan.csy" <shiyan....@alibaba-inc.com> exit nohz idle before invoking softirq, or it maymiss some ticks during softirq.
Signed-off-by: Shiyan Chen <chenshi...@linux.alibaba.com> --- kernel/softirq.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/kernel/softirq.c b/kernel/softirq.c index 9d71046..59bd6fe 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -404,6 +404,10 @@ static inline void tick_irq_exit(void) if (!in_irq()) tick_nohz_irq_exit(); } + + /* need to exit nohz idle if there's a softirq */ + if (in_serving_softirq() || local_softirq_pending()) + tick_nohz_idle_exit(); #endif } @@ -416,10 +420,11 @@ static inline void __irq_exit_rcu(void) #endif account_hardirq_exit(current); preempt_count_sub(HARDIRQ_OFFSET); - if (!in_interrupt() && local_softirq_pending()) - invoke_softirq(); + /* must call before invoke_softirq */ tick_irq_exit(); + if (!in_interrupt() && local_softirq_pending()) + invoke_softirq(); } /** -- 1.8.3.1