Re: [patch] del_timer_sync scalability patch

From: Christoph Lameter
Date: Mon Mar 14 2005 - 14:48:10 EST



On Sun, 13 Mar 2005, Oleg Nesterov wrote:

> I suspect that del_timer_sync() in its current form is racy.
>
> CPU 0 CPU 1
>
> __run_timers() sets timer->base = NULL
>
> del_timer_sync() starts, calls del_timer(), it returns
> because timer->base == NULL.
>
> waits until the run is complete:
> while (base->running_timer == timer)
> preempt_check_resched();
>
> calls schedule(), or long interrupt happens.
>
> timer reschedules itself, __run_timers()
> exits.
>
> base->running_timer == NULL, end of loop.
>
> next timer interrupt, __run_timers() picks
> this timer again, sets timer->base = NULL
>
> if (timer_pending(timer)) // no, timer->base == NULL

timer->base is != NULL because the timer has rescheduled itself.
__mod_timer sets timer->bBase

> goto del_again; // not taken

Yes it is taken!

>
> del_timer_sync() returns
>
> timer runs.

Nope.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/