Once a softirq vector queue has been completed from the workqueue, its call counter for the current jiffy frame can be reset in order to handle those that will follow from the normal IRQ tail softirq processing.
Suggested-by: Linus Torvalds <[email protected]> Signed-off-by: Frederic Weisbecker <[email protected]> Cc: Dmitry Safonov <[email protected]> Cc: Eric Dumazet <[email protected]> Cc: Linus Torvalds <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Andrew Morton <[email protected]> Cc: David Miller <[email protected]> Cc: Hannes Frederic Sowa <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: Levin Alexander <[email protected]> Cc: Paolo Abeni <[email protected]> Cc: Paul E. McKenney <[email protected]> Cc: Radu Rendec <[email protected]> Cc: Rik van Riel <[email protected]> Cc: Stanislaw Gruszka <[email protected]> Cc: Thomas Gleixner <[email protected]> Cc: Wanpeng Li <[email protected]> Cc: Mauro Carvalho Chehab <[email protected]> --- kernel/softirq.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/kernel/softirq.c b/kernel/softirq.c index b2a5384..4e5a0ef 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -255,10 +255,13 @@ static void vector_work_func(struct work_struct *work) local_irq_disable(); pending = local_softirq_pending(); - if (pending & vec_bit) + if (pending & vec_bit) { schedule_work_on(smp_processor_id(), &vector->work); - else + } else { softirq->pending_work_mask &= ~vec_bit; + vector->jiffy_calls = 0; + vector->jiffy_snap = jiffies; + } lockdep_softirq_exit(); account_irq_exit_time(current); -- 2.7.4

