I've found a bug in the write path of the read/write semaphore stuff (at least for the i386 arch). The attached kernel module (rwsem.c) and driver program (driver.c) demonstrate it. What happens is that once the driver finishes, you end up with a whole load of processes forked off of driver that are stuck in the D state and are waiting in down_write_failed(), even though the semaphore is in the unlocked state.