Why do some kernel programmers use goto instead of simple while loops?
12:20 21 Oct 2012

When I learned C, teacher told me all day long: "Don't use goto, that's a bad habit, it's ugly, it's dangerous!" and so on.

Why then, do some kernel programmers use goto, for example in this function, where it could be replaced with a simple

while(condition) {} 

or

do {} while(condition);

I can't understand that. Is it better in some cases to use goto instead of while/do-while? And if so, why?

Referenced code:

static u64 sched_clock_local(struct sched_clock_data *scd)
{
    u64 now, clock, old_clock, min_clock, max_clock;
    s64 delta;

again:
    now = sched_clock();
    delta = now - scd->tick_raw;
    if (unlikely(delta < 0))
        delta = 0;

    old_clock = scd->clock;

    /*
     * scd->clock = clamp(scd->tick_gtod + delta,
     *            max(scd->tick_gtod, scd->clock),
     *            scd->tick_gtod + TICK_NSEC);
     */

    clock = scd->tick_gtod + delta;
    min_clock = wrap_max(scd->tick_gtod, old_clock);
    max_clock = wrap_max(old_clock, scd->tick_gtod + TICK_NSEC);

    clock = wrap_max(clock, min_clock);
    clock = wrap_min(clock, max_clock);

    if (cmpxchg64(&scd->clock, old_clock, clock) != old_clock)
        goto again;

    return clock;
}
c linux loops linux-kernel goto