Is there a race between the optimisation for networking code in __mod_timer() and del_timer() - or, at least, a race that matters?
Consider: CPU A CPU B =============================== =============================== [timer X is active] ==>__mod_timer(X) if (timer_pending(timer)) [Take the true path] -- IRQ -- ==>del_timer(X) <== if (timer->expires == expires) [Take the true path] <==return 1 [timer X is not active] There's no locking to prevent this, but __mod_timer() returns without restarting the timer. I'm not sure this is a problem exactly, however, since del_timer() *was* issued, and could've deleted the timer after __mod_timer() returned. A couple of possible alleviations: (1) Recheck timer_pending() before returning from __mod_timer(). (2) Set timer->expires to jiffies in del_timer() - but since there's nothing preventing the optimisation in __mod_timer() from occurring concurrently with del_timer(), this probably won't help. I think it might just be best to put a note in the comments in __mod_timer(). Thoughts? David