aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/kern_sx.c
diff options
context:
space:
mode:
authorKip Macy <kmacy@FreeBSD.org>2007-03-02 07:21:20 +0000
committerKip Macy <kmacy@FreeBSD.org>2007-03-02 07:21:20 +0000
commitc66d7606085f10c4c1ff5004418ac675c237251a (patch)
treeebf400e9b11dfb845d138f5eed5195c04faef4a9 /sys/kern/kern_sx.c
parent1fa420b67190ab510345fa161a851f630b2e9c15 (diff)
downloadsrc-c66d7606085f10c4c1ff5004418ac675c237251a.tar.gz
src-c66d7606085f10c4c1ff5004418ac675c237251a.zip
lock stats updates need to be protected by the lock
Notes
Notes: svn path=/head/; revision=167163
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 967d7a56d574..2109c62280ce 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