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