In the actual code for witness_warn:

- If there aren't spinlocks held, but there are problems with old
  sleeplocks, they are not reported.
- If the spinlock found is not the only one, problems are not reported.

Fix these 2 problems.

Reported by:	tegge
This commit is contained in:
Attilio Rao 2008-10-20 19:22:16 +00:00
parent 7e1bc2729c
commit ca86d51602

View file

@ -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 (lock_list->ll_count == 1 && lock_list->ll_next == NULL &&
lock1->li_lock == lock && n == 0)
return (0);
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");
}
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();