On 2/28/13 12:43 AM, Manuel Bouyer wrote: > A driver not marked MPSAFE will be entered (especially > its interrupt routine, but also from upper layers) with > kernel_lock held. This is what makes spl(9) still work.
A nice clear example of this is in kern/subr_devsw.c, where userland operations on device files are dispatched to their respective drivers. Each place where the driver's function is called is bracketed with DEV_LOCK/DEV_UNLOCK, e.g. this case implementing read(2): > DEV_LOCK(d); > rv = (*d->d_read)(dev, uio, flag); > DEV_UNLOCK(d); > > return rv; where DEV_LOCK acquires the kernel lock if the driver's device entry doesn't have D_MPSAFE set: > #define DEV_LOCK(d) \ > if ((mpflag = (d->d_flag & D_MPSAFE)) == 0) { \ > KERNEL_LOCK(1, NULL); \ > } and KERNEL_LOCK() acquires a global lock, as well as doing a bunch of other housekeeping.