Date: Wed, 5 Dec 2001 14:52:36 -0800 (PST) From: Luigi Rizzo <luigi@FreeBSD.org> To: cvs-committers@FreeBSD.org, cvs-all@FreeBSD.org Subject: cvs commit: src/sys/pci if_dc.c if_sis.c Message-ID: <200112052252.fB5Mqa521638@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
luigi 2001/12/05 14:52:36 PST
Modified files: (Branch: RELENG_4)
sys/pci if_dc.c if_sis.c
Log:
Move the clearing of IFF_RUNNING early in *_stop(), before actually
freeing resources (IFF_RUNNING means resources _are_ allocated).
Because *_stop() is not protected by splimp(), and it is not always
called at splimp() (e.g. from *_shutdown()), the old code could
potentially cause a panic at shutdown in the very rare case you
get an interrupt from a device sharing the same IRQ line in the
middle of *_stop().
With polling enabled, this "rare" case become slightly more frequent
because clock interrupts can also hit you in the middle of *_stop().
Note that this was a bug in the original drivers, not in the
polling code.
Note also that some other drivers (not all) have a similar bug.
The code in CURRENT seems to be safe because *_stop() is wrapped
in LOCK/UNLOCK calls. Maybe it would be more robust to use splimp()
around *_stop() as well.
Revision Changes Path
1.9.2.28 +2 -2 src/sys/pci/if_dc.c
1.13.4.13 +3 -2 src/sys/pci/if_sis.c
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200112052252.fB5Mqa521638>
