]> granicus.if.org Git - spl/commit
Don't hold mutex until release cv in cv_wait
authorChunwei Chen <tuxoko@gmail.com>
Thu, 7 Jan 2016 03:05:24 +0000 (19:05 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 12 Jan 2016 23:18:44 +0000 (15:18 -0800)
commite843553d0341c4edd880f5ad40da8211669348bd
treed71efe6f7966a31a0a1a5a0198e8888aa26e19a4
parentd297a5a3a1cfa6341ef301780b4fd0545c851bdc
Don't hold mutex until release cv in cv_wait

If a thread is holding mutex when doing cv_destroy, it might end up waiting a
thread in cv_wait. The waiter would wake up trying to aquire the same mutex
and cause deadlock.

We solve this by move the mutex_enter to the bottom of cv_wait, so that
the waiter will release the cv first, allowing cv_destroy to succeed and have
a chance to free the mutex.

This would create race condition on the cv_mutex. We use xchg to set and check
it to ensure we won't be harmed by the race. This would result in the cv_mutex
debugging becomes best-effort.

Also, the change reveals a race, which was unlikely before, where we call
mutex_destroy while test threads are still holding the mutex. We use
kthread_stop to make sure the threads are exit before mutex_destroy.

Signed-off-by: Chunwei Chen <tuxoko@gmail.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Tim Chase <tim@chase2k.com>
Issue zfsonlinux/zfs#4166
Issue zfsonlinux/zfs#4106
module/spl/spl-condvar.c
module/splat/splat-condvar.c