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 <[email protected]> Signed-off-by: Paolo Abeni <[email protected]> Signed-off-by: Hannes Frederic Sowa <[email protected]> --- 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

