__do_softirq() loop cleanup
PATCH 1/1 __do_softirq() loop cleanup
Hi,
This changes __do_softirq() to use a C looping construct instead of simulating one by means of goto.
Signed-off-by Johannes Weiner <[email protected]>
kernel/softirq.c +19 -20
@@ -212,38 +212,37 @@ asmlinkage void __do_softirq(void)int max_restart =MAX_SOFTIRQ_RESTART ;int cpu; - pending =local_softirq_pending ();account_system_vtime (current);__local_bh_disable ((unsigned long )__builtin_return_address (0 ));trace_softirq_enter (); cpu =smp_processor_id (); -restart: -/* Reset the pending bitmask before enabling irqs */ -set_softirq_pending (0 ); -local_irq_enable (); +while ((pending =local_softirq_pending ())) { +if (!max_restart--) { +wakeup_softirqd (); +break ; + } - h = softirq_vec; +/* Reset the pending bitmask before enabling irqs */ +set_softirq_pending (0 ); -do { -if (pending &1 ) { - h->action (h); -rcu_bh_qsctr_inc (cpu); - } - h++; - pending >>=1 ; - }while (pending); +local_irq_enable (); -local_irq_disable (); + h = softirq_vec; - pending =local_softirq_pending (); -if (pending && --max_restart) - goto restart; +do { +if (pending &1 ) { + h->action (h); +rcu_bh_qsctr_inc (cpu); + } + h++; + pending >>=1 ; + }while (pending); -if (pending) -wakeup_softirqd (); +local_irq_disable (); + }trace_softirq_exit ();
Quoted 7 lines · Johannes Weiner
Hi,
This changes
__do_softirq()to use a C looping construct instead of simulating one by means of goto.Signed-off-by Johannes Weiner <[email protected]>
I've read over the logic three times and it seems to keep with the original design. So unless I missed something ...
Acked-by Steven Rostedt <[email protected]>
-- Steve