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();
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to