cvs commit: src/sys/arm/xscale/ixp425 ixp425_npe.c src/sys/dev/ipw if_ipw.c if_ipwvar.h src/sys/dev/isp isp_freebsd.h src/sys/dev/iwi if_iwi.c if_iwivar.h src/sys/dev/mxge if_mxge.c src/sys/kern subr_firmware.c src/sys/sys firmware.h src/sys/tools fw_stub.awk

Andrew Gallatin gallatin at
Wed Feb 21 18:22:35 UTC 2007

Luigi Rizzo writes:
 > On Wed, Feb 21, 2007 at 12:50:44PM -0500, Andrew Gallatin wrote:
 > ...
 > > Speaking of icky, I'm really worried about the pedantic nature of
 > > FreeBSD's WITNESS and "never, ever sleep while holding a mutex" dogma
 > > causing as many problems as it solves.  For example, iwi seems to
 > > simply drop its lock when loading firmware (presumably to avoid
 > > WITNESS squawking about holding a mutex while grabbing an sx).  This
 > > certainly shuts up WITNESS, but it may also introduce a race,
 > > especially if the linker needs to sleep and wait for the disk.
 > i am not sure i follow you here...
 > Of course when you drop the lock you risk that the underlying
 > data structure is manipulated (or in the worst case freed),
 > but usually you can avoid this with something like
 > 	<while locked>
 > 	sc->flags |= LEAVE_ME_ALONE

Sorry, I hadn't noticed that iwi set a flag like that.  I was
searching for IWI_UNLOCK(), and it was off the screen :). I've used
hacks like that myself in the past.  But still, it looks like it only
protects the fw loading, and if I knew the driver well enough, I could
probably find a scenario where something else protected by the lock
races with a firmware load.

I just think it would be safer, and less hacky to be allowed to hold
a driver mutex while potentially sleeping in the firmware code (and in
similar scenarios).  I tried using an sx lock in one of my drivers for
this reason, and eventually got burned when I added multicast support,
because something called my if_ioctl with a mutex held.


More information about the cvs-src mailing list