Currently cond_resched_softirq() fails to reschedule if there are pending softirq but no other running process. This happens i.e. when receiving an interrupt with local bh disabled.
Reported-by: Eric Dumazet <eric.duma...@gmail.com> Signed-off-by: Paolo Abeni <pab...@redhat.com> Signed-off-by: Hannes Frederic Sowa <han...@stressinduktion.org> --- kernel/sched/core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 7f2cae4..788625f 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -4837,7 +4837,8 @@ int __sched __cond_resched_softirq(void) { BUG_ON(!in_softirq()); - if (should_resched(SOFTIRQ_DISABLE_OFFSET)) { + if (should_resched(SOFTIRQ_DISABLE_OFFSET) || + local_softirq_pending()) { local_bh_enable(); preempt_schedule_common(); local_bh_disable(); -- 1.8.3.1