zfs/module/spl
Chunwei Chen e843553d03 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
2016-01-12 15:18:44 -08:00
..
Makefile.in Support parallel build trees (VPATH builds) 2015-07-17 12:53:11 -07:00
spl-atomic.c Refresh links to web site 2013-03-04 19:09:34 -08:00
spl-condvar.c Don't hold mutex until release cv in cv_wait 2016-01-12 15:18:44 -08:00
spl-cred.c Remove credential configure checks. 2014-10-17 15:11:51 -07:00
spl-err.c Retire legacy debugging infrastructure 2014-11-19 10:35:07 -08:00
spl-generic.c Retire spl_module_init()/spl_module_fini() 2015-02-27 13:43:39 -08:00
spl-kmem-cache.c Use spl_fstrans_mark instead of memalloc_noio_save 2015-12-18 13:24:52 -08:00
spl-kmem.c Use spl_fstrans_mark instead of memalloc_noio_save 2015-12-18 13:24:52 -08:00
spl-kobj.c Fix GFP_KERNEL allocations flags 2015-01-21 15:25:19 -08:00
spl-kstat.c Refactor existing code 2015-01-16 13:55:08 -08:00
spl-mutex.c Remove adaptive mutex implementation 2014-10-17 15:07:28 -07:00
spl-proc.c Provide kstat for taskqs 2015-12-16 09:35:22 -08:00
spl-rwlock.c Refresh links to web site 2013-03-04 19:09:34 -08:00
spl-taskq.c Use spl_fstrans_mark instead of memalloc_noio_save 2015-12-18 13:24:52 -08:00
spl-thread.c Retire legacy debugging infrastructure 2014-11-19 10:35:07 -08:00
spl-tsd.c Fix cstyle issues in spl-tsd.c 2015-04-24 14:23:07 -07:00
spl-vmem.c Use spl_fstrans_mark instead of memalloc_noio_save 2015-12-18 13:24:52 -08:00
spl-vnode.c Fix race between getf() and areleasef() 2015-12-03 15:44:47 -08:00
spl-xdr.c Retire legacy debugging infrastructure 2014-11-19 10:35:07 -08:00
spl-zlib.c Refactor existing code 2015-01-16 13:55:08 -08:00