summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_lock.c
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2005-03-25 00:00:44 +0000
committerjeff <jeff@FreeBSD.org>2005-03-25 00:00:44 +0000
commit26329d2e37349295262af1f4f0446e2986265922 (patch)
tree5a34c0541d2e0e78e013538b1468ad8c85dfadc2 /sys/kern/kern_lock.c
parentf1944299a8dede27779224f9a3826eef77ec0372 (diff)
downloadFreeBSD-src-26329d2e37349295262af1f4f0446e2986265922.zip
FreeBSD-src-26329d2e37349295262af1f4f0446e2986265922.tar.gz
- Restore COUNT() in all of its original glory. Don't make it dependent
on DEBUG as ufs will soon grow a dependency on this count. Discussed with: bde Sponsored by: Isilon Systems, Inc.
Diffstat (limited to 'sys/kern/kern_lock.c')
-rw-r--r--sys/kern/kern_lock.c36
1 files changed, 19 insertions, 17 deletions
diff --git a/sys/kern/kern_lock.c b/sys/kern/kern_lock.c
index c9c2314..5e5fe0b 100644
--- a/sys/kern/kern_lock.c
+++ b/sys/kern/kern_lock.c
@@ -66,6 +66,8 @@ __FBSDID("$FreeBSD$");
#define LOCK_INLINE __inline
#endif
+#define COUNT(td, x) if ((td)) (td)->td_locks += (x)
+
#define LK_ALL (LK_HAVE_EXCL | LK_WANT_EXCL | LK_WANT_UPGRADE | \
LK_SHARE_NONZERO | LK_WAIT_NONZERO)
@@ -88,16 +90,18 @@ lockmgr_init(void *dummy __unused)
SYSINIT(lmgrinit, SI_SUB_LOCKMGR, SI_ORDER_FIRST, lockmgr_init, NULL)
static LOCK_INLINE void
-sharelock(struct lock *lkp, int incr) {
+sharelock(struct thread *td, struct lock *lkp, int incr) {
lkp->lk_flags |= LK_SHARE_NONZERO;
lkp->lk_sharecount += incr;
+ COUNT(td, incr);
}
static LOCK_INLINE void
-shareunlock(struct lock *lkp, int decr) {
+shareunlock(struct thread *td, struct lock *lkp, int decr) {
KASSERT(lkp->lk_sharecount >= decr, ("shareunlock: count < decr"));
+ COUNT(td, -decr);
if (lkp->lk_sharecount == decr) {
lkp->lk_flags &= ~LK_SHARE_NONZERO;
if (lkp->lk_flags & (LK_WANT_UPGRADE | LK_WANT_EXCL)) {
@@ -269,9 +273,7 @@ debuglockmgr(lkp, flags, interlkp, td, name, file, line)
error = acquire(&lkp, extflags, lockflags);
if (error)
break;
- if (td != NULL)
- td->td_locks++;
- sharelock(lkp, 1);
+ sharelock(td, lkp, 1);
#if defined(DEBUG_LOCKS)
lkp->lk_slockholder = thr;
lkp->lk_sfilename = file;
@@ -284,7 +286,7 @@ debuglockmgr(lkp, flags, interlkp, td, name, file, line)
* We hold an exclusive lock, so downgrade it to shared.
* An alternative would be to fail with EDEADLK.
*/
- sharelock(lkp, 1);
+ sharelock(td, lkp, 1);
/* FALLTHROUGH downgrade */
case LK_DOWNGRADE:
@@ -292,7 +294,8 @@ debuglockmgr(lkp, flags, interlkp, td, name, file, line)
("lockmgr: not holding exclusive lock "
"(owner thread (%p) != thread (%p), exlcnt (%d) != 0",
lkp->lk_lockholder, thr, lkp->lk_exclusivecount));
- sharelock(lkp, lkp->lk_exclusivecount);
+ sharelock(td, lkp, lkp->lk_exclusivecount);
+ COUNT(td, -lkp->lk_exclusivecount);
lkp->lk_exclusivecount = 0;
lkp->lk_flags &= ~LK_HAVE_EXCL;
lkp->lk_lockholder = LK_NOPROC;
@@ -307,7 +310,7 @@ debuglockmgr(lkp, flags, interlkp, td, name, file, line)
* exclusive access.
*/
if (lkp->lk_flags & LK_WANT_UPGRADE) {
- shareunlock(lkp, 1);
+ shareunlock(td, lkp, 1);
error = EBUSY;
break;
}
@@ -324,7 +327,7 @@ debuglockmgr(lkp, flags, interlkp, td, name, file, line)
*/
if ((lkp->lk_lockholder == thr) || (lkp->lk_sharecount <= 0))
panic("lockmgr: upgrade exclusive lock");
- shareunlock(lkp, 1);
+ shareunlock(td, lkp, 1);
/*
* If we are just polling, check to see if we will block.
*/
@@ -354,6 +357,7 @@ debuglockmgr(lkp, flags, interlkp, td, name, file, line)
lkp->lk_flags |= LK_HAVE_EXCL;
lkp->lk_lockholder = thr;
lkp->lk_exclusivecount = 1;
+ COUNT(td, 1);
#if defined(DEBUG_LOCKS)
lkp->lk_filename = file;
lkp->lk_lineno = line;
@@ -379,9 +383,8 @@ debuglockmgr(lkp, flags, interlkp, td, name, file, line)
if ((extflags & (LK_NOWAIT | LK_CANRECURSE)) == 0)
panic("lockmgr: locking against myself");
if ((extflags & LK_CANRECURSE) != 0) {
- if (td != NULL)
- td->td_locks++;
lkp->lk_exclusivecount++;
+ COUNT(td, 1);
break;
}
}
@@ -415,8 +418,7 @@ debuglockmgr(lkp, flags, interlkp, td, name, file, line)
if (lkp->lk_exclusivecount != 0)
panic("lockmgr: non-zero exclusive count");
lkp->lk_exclusivecount = 1;
- if (td != NULL)
- td->td_locks++;
+ COUNT(td, 1);
#if defined(DEBUG_LOCKS)
lkp->lk_filename = file;
lkp->lk_lineno = line;
@@ -425,9 +427,6 @@ debuglockmgr(lkp, flags, interlkp, td, name, file, line)
break;
case LK_RELEASE:
- if (td != NULL && lkp->lk_lockholder != LK_KERNPROC &&
- lkp->lk_exclusivecount + lkp->lk_sharecount != 0)
- td->td_locks--;
if (lkp->lk_exclusivecount != 0) {
if (lkp->lk_lockholder != thr &&
lkp->lk_lockholder != LK_KERNPROC) {
@@ -435,6 +434,8 @@ debuglockmgr(lkp, flags, interlkp, td, name, file, line)
thr, "exclusive lock holder",
lkp->lk_lockholder);
}
+ if (lkp->lk_lockholder != LK_KERNPROC)
+ COUNT(td, -1);
if (lkp->lk_exclusivecount == 1) {
lkp->lk_flags &= ~LK_HAVE_EXCL;
lkp->lk_lockholder = LK_NOPROC;
@@ -443,7 +444,7 @@ debuglockmgr(lkp, flags, interlkp, td, name, file, line)
lkp->lk_exclusivecount--;
}
} else if (lkp->lk_flags & LK_SHARE_NONZERO)
- shareunlock(lkp, 1);
+ shareunlock(td, lkp, 1);
if (lkp->lk_flags & LK_WAIT_NONZERO)
wakeup((void *)lkp);
break;
@@ -464,6 +465,7 @@ debuglockmgr(lkp, flags, interlkp, td, name, file, line)
lkp->lk_flags |= LK_DRAINING | LK_HAVE_EXCL;
lkp->lk_lockholder = thr;
lkp->lk_exclusivecount = 1;
+ COUNT(td, 1);
if (td != NULL)
td->td_locks++;
#if defined(DEBUG_LOCKS)
OpenPOWER on IntegriCloud