Author: alfred
Date: Tue Dec 11 07:08:14 2012
New Revision: 244112
URL: http://svnweb.freebsd.org/changeset/base/244112

Log:
  Cleanup more of the kassert_panic.
  
  fix compile warnings on !amd64 and NULL derefs that would happen
  if kassert_panic() would return.

Modified:
  head/sys/kern/subr_witness.c

Modified: head/sys/kern/subr_witness.c
==============================================================================
--- head/sys/kern/subr_witness.c        Tue Dec 11 05:59:16 2012        
(r244111)
+++ head/sys/kern/subr_witness.c        Tue Dec 11 07:08:14 2012        
(r244112)
@@ -1446,10 +1446,12 @@ witness_upgrade(struct lock_object *lock
                            fixup_filename(file), line);
        }
        instance = find_instance(curthread->td_sleeplocks, lock);
-       if (instance == NULL)
+       if (instance == NULL) {
                kassert_panic("upgrade of unlocked lock (%s) %s @ %s:%d",
                    class->lc_name, lock->lo_name,
                    fixup_filename(file), line);
+               return;
+       }
        if (witness_watch) {
                if ((instance->li_flags & LI_EXCLUSIVE) != 0)
                        kassert_panic(
@@ -1490,10 +1492,12 @@ witness_downgrade(struct lock_object *lo
                            fixup_filename(file), line);
        }
        instance = find_instance(curthread->td_sleeplocks, lock);
-       if (instance == NULL)
+       if (instance == NULL) {
                kassert_panic("downgrade of unlocked lock (%s) %s @ %s:%d",
                    class->lc_name, lock->lo_name,
                    fixup_filename(file), line);
+               return;
+       }
        if (witness_watch) {
                if ((instance->li_flags & LI_EXCLUSIVE) == 0)
                        kassert_panic(
@@ -1544,11 +1548,13 @@ witness_unlock(struct lock_object *lock,
         * We have to make sure we flush these queues, so just search for
         * eventual register locks and remove them.
         */
-       if (witness_watch > 0)
+       if (witness_watch > 0) {
                kassert_panic("lock (%s) %s not locked @ %s:%d", class->lc_name,
                    lock->lo_name, fixup_filename(file), line);
-       else
                return;
+       } else {
+               return;
+       }
 found:
 
        /* First, check for shared/exclusive mismatches. */
@@ -1761,11 +1767,13 @@ enroll(const char *description, struct l
                        return (NULL);
                else
                        typelist = &w_spin;
-       } else if ((lock_class->lc_flags & LC_SLEEPLOCK))
+       } else if ((lock_class->lc_flags & LC_SLEEPLOCK)) {
                typelist = &w_sleep;
-       else
+       } else {
                kassert_panic("lock class %s is not sleep or spin",
                    lock_class->lc_name);
+               return (NULL);
+       }
 
        mtx_lock_spin(&w_mtx);
        w = witness_hash_get(description);
@@ -1921,19 +1929,26 @@ adopt(struct witness *parent, struct wit
 static void
 itismychild(struct witness *parent, struct witness *child)
 {
+       int unlocked;
 
        MPASS(child != NULL && parent != NULL);
        if (witness_cold == 0)
                mtx_assert(&w_mtx, MA_OWNED);
 
        if (!witness_lock_type_equal(parent, child)) {
-               if (witness_cold == 0)
+               if (witness_cold == 0) {
+                       unlocked = 1;
                        mtx_unlock_spin(&w_mtx);
+               } else {
+                       unlocked = 0;
+               }
                kassert_panic(
                    "%s: parent \"%s\" (%s) and child \"%s\" (%s) are not "
                    "the same lock type", __func__, parent->w_name,
                    parent->w_class->lc_name, child->w_name,
                    child->w_class->lc_name);
+               if (unlocked)
+                       mtx_lock_spin(&w_mtx);
        }
        adopt(parent, child);
 }
@@ -2203,9 +2218,11 @@ witness_save(struct lock_object *lock, c
                lock_list = PCPU_GET(spinlocks);
        }
        instance = find_instance(lock_list, lock);
-       if (instance == NULL)
+       if (instance == NULL) {
                kassert_panic("%s: lock (%s) %s not locked", __func__,
                    class->lc_name, lock->lo_name);
+               return;
+       }
        *filep = instance->li_file;
        *linep = instance->li_line;
 }
@@ -2241,6 +2258,8 @@ witness_restore(struct lock_object *lock
                    class->lc_name, lock->lo_name);
        lock->lo_witness->w_file = file;
        lock->lo_witness->w_line = line;
+       if (instance == NULL)
+               return;
        instance->li_file = file;
        instance->li_line = line;
 }
@@ -2336,9 +2355,11 @@ witness_setflag(struct lock_object *lock
                lock_list = PCPU_GET(spinlocks);
        }
        instance = find_instance(lock_list, lock);
-       if (instance == NULL)
+       if (instance == NULL) {
                kassert_panic("%s: lock (%s) %s not locked", __func__,
                    class->lc_name, lock->lo_name);
+               return;
+       }
 
        if (set)
                instance->li_flags |= flag;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to