One more step toward converting ksoftirqd to per vector workqueues.
Suggested-by: Paolo Abeni <[email protected]>
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 | 18 ++++++++----------
1 file changed, 8 insertions(+), 10 deletions(-)
diff --git a/kernel/softirq.c b/kernel/softirq.c
index becb1d9..bb0cffa 100644
--- a/kernel/softirq.c
+++ b/kernel/softirq.c
@@ -369,16 +369,14 @@ asmlinkage __visible void __softirq_entry
__do_softirq(void)
pending = local_softirq_pending() & ~softirq->pending_work_mask;
if (pending) {
- if (need_resched()) {
- wakeup_softirqd();
- } else {
- /* Vectors that got re-enqueued are threaded */
- if (executed & pending)
- do_softirq_workqueue(executed & pending);
- pending &= ~executed;
- if (pending)
- goto restart;
- }
+ if (need_resched())
+ executed = pending;
+ /* Vectors that got re-enqueued are threaded */
+ if (executed & pending)
+ do_softirq_workqueue(executed & pending);
+ pending &= ~executed;
+ if (pending)
+ goto restart;
}
lockdep_softirq_end(in_hardirq);
--
2.7.4