Andrey Savochkin wrote:
>
> Hello,
Hi, Andrey.
> ...
> For eepro100 it should be
>
> --- eepro100.c Tue Apr 4 11:05:23 2000
> +++ eepro100.c-timer Mon May 22 09:35:52 2000
> @@ -1799,7 +1799,9 @@
> dev->name, inw(ioaddr + SCBStatus));
>
> /* Shut off the media monitoring timer. */
> + start_bh_atomic();
> del_timer(&sp->timer);
> + end_bh_atomic();
>
> /* Shutting down the chip nicely fails to disable flow control. So..
> */
> outl(PortPartialReset, ioaddr + SCBPort);
hmm.. But if the timer handler was running before the
start_bh_atomic(), it will continue to run during and after the
del_timer().
_Somewhere_ the mainline code needs to spin until the timer handler has
finished.
So we need a lock to serialise del_timer() wrt the handlers. It can be
either the global_bh_lock or the timerlist_lock; it doesn't matter a
lot. I'm using the timerlist_lock at present because it looks to me
like global_bh_lock has its head on the chopping block - sometime we're
going to make timer handlers non-serialised and things which play with
global_bh_lock will probably break.
> ...
>
> As far as I remember, all BHs were single threaded in 2.2 kernels, so if
> we're in BH, handler can't run on another CPU.
That is also the case in 2.3. Timer handlers are globally serialised.
Only one handler can be running at a time, system-wide.
Where's Alexey, BTW? If he's busily coding a fix for this I'm gonna
strangle him :)
--
-akpm-
|