cvp->cv_magic = CV_MAGIC;
init_waitqueue_head(&cvp->cv_event);
- spin_lock_init(&cvp->cv_lock);
atomic_set(&cvp->cv_waiters, 0);
cvp->cv_mutex = NULL;
cvp->cv_name = NULL;
SENTRY;
ASSERT(cvp);
ASSERT(cvp->cv_magic == CV_MAGIC);
- spin_lock(&cvp->cv_lock);
+ ASSERT(cvp->cv_mutex == NULL);
ASSERT(atomic_read(&cvp->cv_waiters) == 0);
ASSERT(!waitqueue_active(&cvp->cv_event));
if (cvp->cv_name)
kmem_free(cvp->cv_name, cvp->cv_name_size);
- spin_unlock(&cvp->cv_lock);
- memset(cvp, CV_POISON, sizeof(*cvp));
+ ASSERT3P(memset(cvp, CV_POISON, sizeof(*cvp)), ==, cvp);
SEXIT;
}
EXPORT_SYMBOL(__cv_destroy);
ASSERT(cvp);
ASSERT(mp);
ASSERT(cvp->cv_magic == CV_MAGIC);
- spin_lock(&cvp->cv_lock);
ASSERT(mutex_owned(mp));
if (cvp->cv_mutex == NULL)
/* Ensure the same mutex is used by all callers */
ASSERT(cvp->cv_mutex == mp);
- spin_unlock(&cvp->cv_lock);
prepare_to_wait_exclusive(&cvp->cv_event, &wait, state);
atomic_inc(&cvp->cv_waiters);
schedule();
mutex_enter(mp);
- atomic_dec(&cvp->cv_waiters);
+ /* No more waiters a different mutex could be used */
+ if (atomic_dec_and_test(&cvp->cv_waiters))
+ cvp->cv_mutex = NULL;
+
finish_wait(&cvp->cv_event, &wait);
SEXIT;
}
ASSERT(cvp);
ASSERT(mp);
ASSERT(cvp->cv_magic == CV_MAGIC);
- spin_lock(&cvp->cv_lock);
ASSERT(mutex_owned(mp));
if (cvp->cv_mutex == NULL)
/* Ensure the same mutex is used by all callers */
ASSERT(cvp->cv_mutex == mp);
- spin_unlock(&cvp->cv_lock);
/* XXX - Does not handle jiffie wrap properly */
time_left = expire_time - jiffies;
time_left = schedule_timeout(time_left);
mutex_enter(mp);
- atomic_dec(&cvp->cv_waiters);
+ /* No more waiters a different mutex could be used */
+ if (atomic_dec_and_test(&cvp->cv_waiters))
+ cvp->cv_mutex = NULL;
+
finish_wait(&cvp->cv_event, &wait);
SRETURN(time_left > 0 ? time_left : -1);