kern_lock.c (164212) | kern_lock.c (164246) |
---|---|
1/*- 2 * Copyright (c) 1995 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Copyright (C) 1997 6 * John S. Dyson. All rights reserved. 7 * 8 * This code contains ideas from software contributed to Berkeley by --- 27 unchanged lines hidden (view full) --- 36 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 37 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 38 * SUCH DAMAGE. 39 * 40 * @(#)kern_lock.c 8.18 (Berkeley) 5/21/95 41 */ 42 43#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 1995 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Copyright (C) 1997 6 * John S. Dyson. All rights reserved. 7 * 8 * This code contains ideas from software contributed to Berkeley by --- 27 unchanged lines hidden (view full) --- 36 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 37 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 38 * SUCH DAMAGE. 39 * 40 * @(#)kern_lock.c 8.18 (Berkeley) 5/21/95 41 */ 42 43#include <sys/cdefs.h> |
44__FBSDID("$FreeBSD: head/sys/kern/kern_lock.c 164212 2006-11-12 03:30:01Z kmacy $"); | 44__FBSDID("$FreeBSD: head/sys/kern/kern_lock.c 164246 2006-11-13 05:41:46Z kmacy $"); |
45 46#include "opt_ddb.h" 47#include "opt_global.h" 48 49#include <sys/param.h> 50#include <sys/kdb.h> 51#include <sys/kernel.h> 52#include <sys/ktr.h> --- 4 unchanged lines hidden (view full) --- 57#include <sys/systm.h> 58#include <sys/lock_profile.h> 59#ifdef DEBUG_LOCKS 60#include <sys/stack.h> 61#endif 62 63#ifdef DDB 64#include <ddb/ddb.h> | 45 46#include "opt_ddb.h" 47#include "opt_global.h" 48 49#include <sys/param.h> 50#include <sys/kdb.h> 51#include <sys/kernel.h> 52#include <sys/ktr.h> --- 4 unchanged lines hidden (view full) --- 57#include <sys/systm.h> 58#include <sys/lock_profile.h> 59#ifdef DEBUG_LOCKS 60#include <sys/stack.h> 61#endif 62 63#ifdef DDB 64#include <ddb/ddb.h> |
65static void db_show_lockmgr(struct lock_object *lock); |
|
65#endif 66 | 66#endif 67 |
68 69struct lock_class lock_class_lockmgr = { 70 "lockmgr", 71 LC_SLEEPLOCK | LC_SLEEPABLE | LC_RECURSABLE | LC_UPGRADABLE, 72#ifdef DDB 73 db_show_lockmgr 74#endif 75}; 76 77 |
|
67/* 68 * Locking primitives implementation. 69 * Locks provide shared/exclusive sychronization. 70 */ 71 72#define COUNT(td, x) if ((td)) (td)->td_locks += (x) 73#define LK_ALL (LK_HAVE_EXCL | LK_WANT_EXCL | LK_WANT_UPGRADE | \ 74 LK_SHARE_NONZERO | LK_WAIT_NONZERO) --- 86 unchanged lines hidden (view full) --- 161 162 error = 0; 163 if (td == NULL) 164 thr = LK_KERNPROC; 165 else 166 thr = td; 167 168 lock_profile_waitstart(&waitstart); | 78/* 79 * Locking primitives implementation. 80 * Locks provide shared/exclusive sychronization. 81 */ 82 83#define COUNT(td, x) if ((td)) (td)->td_locks += (x) 84#define LK_ALL (LK_HAVE_EXCL | LK_WANT_EXCL | LK_WANT_UPGRADE | \ 85 LK_SHARE_NONZERO | LK_WAIT_NONZERO) --- 86 unchanged lines hidden (view full) --- 172 173 error = 0; 174 if (td == NULL) 175 thr = LK_KERNPROC; 176 else 177 thr = td; 178 179 lock_profile_waitstart(&waitstart); |
169 170 lkp->lk_object.lo_type = "lockmgr"; | |
171 if ((flags & LK_INTERNAL) == 0) 172 mtx_lock(lkp->lk_interlock); 173 CTR6(KTR_LOCK, 174 "lockmgr(): lkp == %p (lk_wmesg == \"%s\"), owner == %p, exclusivecount == %d, flags == 0x%x, " 175 "td == %p", lkp, lkp->lk_wmesg, lkp->lk_lockholder, 176 lkp->lk_exclusivecount, flags, td); 177#ifdef DEBUG_LOCKS 178 { --- 339 unchanged lines hidden (view full) --- 518 lkp->lk_prio = prio; 519 lkp->lk_wmesg = wmesg; 520 lkp->lk_timo = timo; 521 lkp->lk_lockholder = LK_NOPROC; 522 lkp->lk_newlock = NULL; 523#ifdef DEBUG_LOCKS 524 stack_zero(&lkp->lk_stack); 525#endif | 180 if ((flags & LK_INTERNAL) == 0) 181 mtx_lock(lkp->lk_interlock); 182 CTR6(KTR_LOCK, 183 "lockmgr(): lkp == %p (lk_wmesg == \"%s\"), owner == %p, exclusivecount == %d, flags == 0x%x, " 184 "td == %p", lkp, lkp->lk_wmesg, lkp->lk_lockholder, 185 lkp->lk_exclusivecount, flags, td); 186#ifdef DEBUG_LOCKS 187 { --- 339 unchanged lines hidden (view full) --- 527 lkp->lk_prio = prio; 528 lkp->lk_wmesg = wmesg; 529 lkp->lk_timo = timo; 530 lkp->lk_lockholder = LK_NOPROC; 531 lkp->lk_newlock = NULL; 532#ifdef DEBUG_LOCKS 533 stack_zero(&lkp->lk_stack); 534#endif |
526 lock_profile_object_init(&lkp->lk_object, wmesg); | 535 lock_profile_object_init(&lkp->lk_object, &lock_class_lockmgr, wmesg); |
527} 528 529/* 530 * Destroy a lock. 531 */ 532void 533lockdestroy(lkp) 534 struct lock *lkp; --- 108 unchanged lines hidden (view full) --- 643 *ownerp = NULL; 644 } else { 645 db_printf("EXCL (count %d)\n", lkp->lk_exclusivecount); 646 *ownerp = lkp->lk_lockholder; 647 } 648 return (1); 649} 650 | 536} 537 538/* 539 * Destroy a lock. 540 */ 541void 542lockdestroy(lkp) 543 struct lock *lkp; --- 108 unchanged lines hidden (view full) --- 652 *ownerp = NULL; 653 } else { 654 db_printf("EXCL (count %d)\n", lkp->lk_exclusivecount); 655 *ownerp = lkp->lk_lockholder; 656 } 657 return (1); 658} 659 |
651DB_SHOW_COMMAND(lockmgr, db_show_lockmgr) | 660void 661db_show_lockmgr(struct lock_object *lock) |
652{ 653 struct thread *td; 654 struct lock *lkp; 655 | 662{ 663 struct thread *td; 664 struct lock *lkp; 665 |
656 if (!have_addr) 657 return; 658 lkp = (struct lock *)addr; | 666 lkp = (struct lock *)lock; |
659 660 db_printf("lock type: %s\n", lkp->lk_wmesg); 661 db_printf("state: "); 662 if (lkp->lk_sharecount) 663 db_printf("SHARED (count %d)\n", lkp->lk_sharecount); 664 else if (lkp->lk_flags & LK_HAVE_EXCL) { 665 td = lkp->lk_lockholder; 666 db_printf("EXCL (count %d) %p ", lkp->lk_exclusivecount, td); 667 db_printf("(tid %d, pid %d, \"%s\")\n", td->td_tid, 668 td->td_proc->p_pid, td->td_proc->p_comm); 669 } else 670 db_printf("UNLOCKED\n"); 671 if (lkp->lk_waitcount > 0) 672 db_printf("waiters: %d\n", lkp->lk_waitcount); 673} 674#endif | 667 668 db_printf("lock type: %s\n", lkp->lk_wmesg); 669 db_printf("state: "); 670 if (lkp->lk_sharecount) 671 db_printf("SHARED (count %d)\n", lkp->lk_sharecount); 672 else if (lkp->lk_flags & LK_HAVE_EXCL) { 673 td = lkp->lk_lockholder; 674 db_printf("EXCL (count %d) %p ", lkp->lk_exclusivecount, td); 675 db_printf("(tid %d, pid %d, \"%s\")\n", td->td_tid, 676 td->td_proc->p_pid, td->td_proc->p_comm); 677 } else 678 db_printf("UNLOCKED\n"); 679 if (lkp->lk_waitcount > 0) 680 db_printf("waiters: %d\n", lkp->lk_waitcount); 681} 682#endif |