summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_sx.c
diff options
context:
space:
mode:
authorkmacy <kmacy@FreeBSD.org>2007-03-02 07:21:20 +0000
committerkmacy <kmacy@FreeBSD.org>2007-03-02 07:21:20 +0000
commite1b1eae5923c01f8e3a48519bd065108ac5fad4d (patch)
treeebf400e9b11dfb845d138f5eed5195c04faef4a9 /sys/kern/kern_sx.c
parent2d1909f3b99f9a3cb7031477a90f9d71abd25e6d (diff)
downloadFreeBSD-src-e1b1eae5923c01f8e3a48519bd065108ac5fad4d.zip
FreeBSD-src-e1b1eae5923c01f8e3a48519bd065108ac5fad4d.tar.gz
lock stats updates need to be protected by the lock
Diffstat (limited to 'sys/kern/kern_sx.c')
-rw-r--r--sys/kern/kern_sx.c27
1 files changed, 3 insertions, 24 deletions
diff --git a/sys/kern/kern_sx.c b/sys/kern/kern_sx.c
index 967d7a5..2109c62 100644
--- a/sys/kern/kern_sx.c
+++ b/sys/kern/kern_sx.c
@@ -228,10 +228,6 @@ _sx_try_xlock(struct sx *sx, const char *file, int line)
void
_sx_sunlock(struct sx *sx, const char *file, int line)
{
-#ifdef LOCK_PROFILING
- struct lock_object lo;
- int count = -1;
-#endif
_sx_assert(sx, SX_SLOCKED, file, line);
mtx_lock(sx->sx_lock);
@@ -241,13 +237,10 @@ _sx_sunlock(struct sx *sx, const char *file, int line)
/* Release. */
sx->sx_cnt--;
-#ifdef LOCK_PROFILING
if (sx->sx_cnt == 0) {
- memcpy(&lo, &sx->sx_object, sizeof(lo));
- sx->sx_object.lo_flags &= ~LO_CONTESTED;
- count = 0;
+ lock_profile_release_lock(&sx->sx_object);
}
-#endif
+
/*
* If we just released the last shared lock, wake any waiters up, giving
* exclusive lockers precedence. In order to make sure that exclusive
@@ -263,19 +256,11 @@ _sx_sunlock(struct sx *sx, const char *file, int line)
LOCK_LOG_LOCK("SUNLOCK", &sx->sx_object, 0, 0, file, line);
mtx_unlock(sx->sx_lock);
-#ifdef LOCK_PROFILING
- if (count == 0)
- lock_profile_release_lock(&lo);
-#endif
}
void
_sx_xunlock(struct sx *sx, const char *file, int line)
{
-#ifdef LOCK_PROFILING
- struct lock_object lo;
-#endif
-
_sx_assert(sx, SX_XLOCKED, file, line);
mtx_lock(sx->sx_lock);
MPASS(sx->sx_cnt == -1);
@@ -287,10 +272,6 @@ _sx_xunlock(struct sx *sx, const char *file, int line)
sx->sx_cnt++;
sx->sx_xholder = NULL;
-#ifdef LOCK_PROFILING
- memcpy(&lo, &sx->sx_object, sizeof(lo));
- sx->sx_object.lo_flags &= ~LO_CONTESTED;
-#endif
/*
* Wake up waiters if there are any. Give precedence to slock waiters.
*/
@@ -301,10 +282,8 @@ _sx_xunlock(struct sx *sx, const char *file, int line)
LOCK_LOG_LOCK("XUNLOCK", &sx->sx_object, 0, 0, file, line);
+ lock_profile_release_lock(&sx->sx_object);
mtx_unlock(sx->sx_lock);
-#ifdef LOCK_PROFILING
- lock_profile_release_lock(&lo);
-#endif
}
int
OpenPOWER on IntegriCloud