--- kern_mutex.c.orig 2008-05-21 08:32:31.000000000 +0930 +++ kern_mutex.c 2008-06-12 21:01:04.182472766 +0930 @@ -223,6 +223,12 @@ KASSERT(LOCK_CLASS(&m->lock_object) == &lock_class_mtx_spin, ("mtx_lock_spin() of sleep mutex %s @ %s:%d", m->lock_object.lo_name, file, line)); + KASSERT((m->lock_object.lo_flags & LO_RECURSABLE) != 0, + ("mtx_lock_spin: recursed on non-recursive mutex %s @ %s:%d\n", + m->lock_object.lo_name, file, line)); + if (!strcmp(m->lock_object.lo_name, "sleepq chain")) + CTR4(KTR_SPARE2, "%s: mutex %p held @ %s:%d\n", __func__, m, + file, line); WITNESS_CHECKORDER(&m->lock_object, opts | LOP_NEWORDER | LOP_EXCLUSIVE, file, line); _get_spin_lock(m, curthread, opts, file, line); @@ -241,6 +247,9 @@ KASSERT(LOCK_CLASS(&m->lock_object) == &lock_class_mtx_spin, ("mtx_unlock_spin() of sleep mutex %s @ %s:%d", m->lock_object.lo_name, file, line)); + if (!strcmp(m->lock_object.lo_name, "sleepq chain")) + CTR4(KTR_SPARE2, "%s: mutex %p held @ %s:%d\n", __func__, m, + file, line); WITNESS_UNLOCK(&m->lock_object, opts | LOP_EXCLUSIVE, file, line); LOCK_LOG_LOCK("UNLOCK", &m->lock_object, opts, m->mtx_recurse, file, line); @@ -512,6 +521,12 @@ KASSERT(LOCK_CLASS(&m->lock_object) == &lock_class_mtx_spin, ("thread_lock() of sleep mutex %s @ %s:%d", m->lock_object.lo_name, file, line)); + KASSERT((m->lock_object.lo_flags & LO_RECURSABLE) != 0, + ("thread_lock: recursed on non-recursive mutex %s @ %s:%d\n", + m->lock_object.lo_name, file, line)); + if (!strcmp(m->lock_object.lo_name, "sleepq chain")) + CTR4(KTR_SPARE2, "%s: mutex %p held @ %s:%d\n", + __func__, m, file, line); WITNESS_CHECKORDER(&m->lock_object, opts | LOP_NEWORDER | LOP_EXCLUSIVE, file, line); while (!_obtain_lock(m, tid)) {