diff options
Diffstat (limited to 'sys/kern/subr_witness.c')
-rw-r--r-- | sys/kern/subr_witness.c | 31 |
1 files changed, 12 insertions, 19 deletions
diff --git a/sys/kern/subr_witness.c b/sys/kern/subr_witness.c index ee36ae0..48c4b5c 100644 --- a/sys/kern/subr_witness.c +++ b/sys/kern/subr_witness.c @@ -1628,13 +1628,7 @@ witness_warn(int flags, struct lock_object *lock, const char *fmt, ...) */ sched_pin(); lock_list = PCPU_GET(spinlocks); - if (lock_list != NULL) { - - /* Empty list? */ - if (lock_list->ll_count == 0) { - sched_unpin(); - return (n); - } + if (lock_list != NULL && lock_list->ll_count != 0) { sched_unpin(); /* @@ -1644,18 +1638,17 @@ witness_warn(int flags, struct lock_object *lock, const char *fmt, ...) * should hold. */ lock1 = &lock_list->ll_children[lock_list->ll_count - 1]; - if (lock1->li_lock == lock) - return (n); - - if (n == 0) { - va_start(ap, fmt); - vprintf(fmt, ap); - va_end(ap); - printf(" with the following"); - if (flags & WARN_SLEEPOK) - printf(" non-sleepable"); - printf(" locks held:\n"); - } + if (lock_list->ll_count == 1 && lock_list->ll_next == NULL && + lock1->li_lock == lock && n == 0) + return (0); + + va_start(ap, fmt); + vprintf(fmt, ap); + va_end(ap); + printf(" with the following"); + if (flags & WARN_SLEEPOK) + printf(" non-sleepable"); + printf(" locks held:\n"); n += witness_list_locks(&lock_list); } else sched_unpin(); |