aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2012-09-07 11:05:46 -0700
committerBrian Behlendorf <[email protected]>2012-09-10 10:23:26 -0700
commit3c60f5054cf567ddc4a87e72d16d0a425721e422 (patch)
tree80da7afe2ad1acacdfd78becd114e701bf25cdcd
parent95331f4437d57f0d0a719d38355159b90a52f40d (diff)
Debug cv_destroy() with mutex held
There still appears to be a race in the condition variables where ->cv_mutex is set after we are woken from the cv_destroy wait queue. This might be possible when cv_destroy() is called immediately after cv_broadcast(). We had some troubles with this previously but there may still be a small race, see commit d599e4f. The following patch closes one small race and improves the ASSERTs such that they log the offending value. Signed-off-by: Brian Behlendorf <[email protected]> zfsonlinux/zfs#943
-rw-r--r--module/spl/spl-condvar.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/module/spl/spl-condvar.c b/module/spl/spl-condvar.c
index 52131c1e8..e9f727d72 100644
--- a/module/spl/spl-condvar.c
+++ b/module/spl/spl-condvar.c
@@ -63,7 +63,8 @@ EXPORT_SYMBOL(__cv_init);
static int
cv_destroy_wakeup(kcondvar_t *cvp)
{
- if ((waitqueue_active(&cvp->cv_event)) ||
+ if ((cvp->cv_mutex != NULL) ||
+ (waitqueue_active(&cvp->cv_event)) ||
(atomic_read(&cvp->cv_waiters) > 0))
return 0;
@@ -81,9 +82,9 @@ __cv_destroy(kcondvar_t *cvp)
while (cv_destroy_wakeup(cvp) == 0)
wait_event_timeout(cvp->cv_destroy, cv_destroy_wakeup(cvp), 1);
- ASSERT(cvp->cv_mutex == NULL);
- ASSERT(atomic_read(&cvp->cv_waiters) == 0);
- ASSERT(!waitqueue_active(&cvp->cv_event));
+ ASSERT3P(cvp->cv_mutex, ==, NULL);
+ ASSERT3S(atomic_read(&cvp->cv_waiters), ==, 0);
+ ASSERT3S(waitqueue_active(&cvp->cv_event), ==, 0);
SEXIT;
}