From owner-p4-projects@FreeBSD.ORG Thu Dec 29 19:36:25 2005 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id E4D3816A422; Thu, 29 Dec 2005 19:36:24 +0000 (GMT) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id BAD3316A41F for ; Thu, 29 Dec 2005 19:36:24 +0000 (GMT) (envelope-from jhb@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id B600543D60 for ; Thu, 29 Dec 2005 19:36:23 +0000 (GMT) (envelope-from jhb@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id jBTJaNPF072223 for ; Thu, 29 Dec 2005 19:36:23 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id jBTJaNVi072220 for perforce@freebsd.org; Thu, 29 Dec 2005 19:36:23 GMT (envelope-from jhb@freebsd.org) Date: Thu, 29 Dec 2005 19:36:23 GMT Message-Id: <200512291936.jBTJaNVi072220@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin To: Perforce Change Reviews Cc: Subject: PERFORCE change 88897 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 29 Dec 2005 19:36:25 -0000 http://perforce.freebsd.org/chv.cgi?CH=88897 Change 88897 by jhb@jhb_slimer on 2005/12/29 19:35:53 Support spinlocks in witness_save and witness_restore and turn that part of msleep_spin() back on. Affected files ... .. //depot/projects/smpng/sys/kern/kern_synch.c#95 edit .. //depot/projects/smpng/sys/kern/subr_witness.c#144 edit Differences ... ==== //depot/projects/smpng/sys/kern/kern_synch.c#95 (text+ko) ==== @@ -251,9 +251,7 @@ struct thread *td; struct proc *p; int rval; -#if 0 WITNESS_SAVE_DECL(mtx); -#endif td = curthread; p = td->td_proc; @@ -279,9 +277,7 @@ DROP_GIANT(); mtx_assert(mtx, MA_OWNED | MA_NOTRECURSED); -#if 0 WITNESS_SAVE(&mtx->mtx_object, mtx); -#endif mtx_unlock_spin(mtx); /* @@ -323,9 +319,7 @@ #endif PICKUP_GIANT(); mtx_lock_spin(mtx); -#if 0 WITNESS_RESTORE(&mtx->mtx_object, mtx); -#endif return (rval); } ==== //depot/projects/smpng/sys/kern/subr_witness.c#144 (text+ko) ==== @@ -1805,15 +1805,20 @@ void witness_save(struct lock_object *lock, const char **filep, int *linep) { + struct lock_list_entry *lock_list; struct lock_instance *instance; KASSERT(!witness_cold, ("%s: witness_cold", __func__)); if (lock->lo_witness == NULL || witness_watch == 0 || panicstr != NULL) return; - if ((lock->lo_class->lc_flags & LC_SLEEPLOCK) == 0) - panic("%s: lock (%s) %s is not a sleep lock", __func__, - lock->lo_class->lc_name, lock->lo_name); - instance = find_instance(curthread->td_sleeplocks, lock); + if (lock->lo_class->lc_flags & LC_SLEEPLOCK) + lock_list = curthread->td_sleeplocks; + else { + if (witness_skipspin) + return; + lock_list = PCPU_GET(spinlocks); + } + instance = find_instance(lock_list, lock); if (instance == NULL) panic("%s: lock (%s) %s not locked", __func__, lock->lo_class->lc_name, lock->lo_name); @@ -1824,15 +1829,20 @@ void witness_restore(struct lock_object *lock, const char *file, int line) { + struct lock_list_entry *lock_list; struct lock_instance *instance; KASSERT(!witness_cold, ("%s: witness_cold", __func__)); if (lock->lo_witness == NULL || witness_watch == 0 || panicstr != NULL) return; - if ((lock->lo_class->lc_flags & LC_SLEEPLOCK) == 0) - panic("%s: lock (%s) %s is not a sleep lock", __func__, - lock->lo_class->lc_name, lock->lo_name); - instance = find_instance(curthread->td_sleeplocks, lock); + if (lock->lo_class->lc_flags & LC_SLEEPLOCK) + lock_list = curthread->td_sleeplocks; + else { + if (witness_skipspin) + return; + lock_list = PCPU_GET(spinlocks); + } + instance = find_instance(lock_list, lock); if (instance == NULL) panic("%s: lock (%s) %s not locked", __func__, lock->lo_class->lc_name, lock->lo_name);