Hi list,

It looks like using the goto statement in constructs like

restart:
        // DO SOMETHING
if (condition)
        goto restart;

should be frowned upon and the loop

do {
        // DO SOMETHING
} while (condition);

is more appropriate in such situation.

However, in the __do_softirq() routine located in `kernel/softirq.c' the goto 
construct was chosen in favor of the do-while loop.

The patch included below replaces the goto-based loop by the do-while statement.

If the goto is really necessary here, I would be very grateful if someone could 
explain why.

Signed-off-by: Dmitri Vorobiev <[EMAIL PROTECTED]>
--
diff --git a/kernel/softirq.c b/kernel/softirq.c
index bd89bc4..b0d0431 100644
--- a/kernel/softirq.c
+++ b/kernel/softirq.c
@@ -219,28 +219,28 @@ asmlinkage void __do_softirq(void)
        trace_softirq_enter();

        cpu = smp_processor_id();
-restart:
-       /* Reset the pending bitmask before enabling irqs */
-       set_softirq_pending(0);

-       local_irq_enable();
+       do {
+               /* Reset the pending bitmask before enabling irqs */
+               set_softirq_pending(0);

-       h = softirq_vec;
+               local_irq_enable();

-       do {
-               if (pending & 1) {
-                       h->action(h);
-                       rcu_bh_qsctr_inc(cpu);
-               }
-               h++;
-               pending >>= 1;
-       } while (pending);
+               h = softirq_vec;

-       local_irq_disable();
+               do {
+                       if (pending & 1) {
+                               h->action(h);
+                               rcu_bh_qsctr_inc(cpu);
+                       }
+                       h++;
+                       pending >>= 1;
+               } while (pending);

-       pending = local_softirq_pending();
-       if (pending && --max_restart)
-               goto restart;
+               local_irq_disable();
+
+               pending = local_softirq_pending();
+       } while (pending && --max_restart);

        if (pending)
                wakeup_softirqd();
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to