svn commit: r184098 - head/sys/kern
Attilio Rao
attilio at FreeBSD.org
Mon Oct 20 19:22:16 UTC 2008
Author: attilio
Date: Mon Oct 20 19:22:16 2008
New Revision: 184098
URL: http://svn.freebsd.org/changeset/base/184098
Log:
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
Modified:
head/sys/kern/subr_witness.c
Modified: head/sys/kern/subr_witness.c
==============================================================================
--- head/sys/kern/subr_witness.c Mon Oct 20 18:56:00 2008 (r184097)
+++ head/sys/kern/subr_witness.c Mon Oct 20 19:22:16 2008 (r184098)
@@ -1628,13 +1628,7 @@ witness_warn(int flags, struct lock_obje
*/
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_obje
* 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();
More information about the svn-src-head
mailing list