diff options
author | kmacy <kmacy@FreeBSD.org> | 2007-03-02 07:21:20 +0000 |
---|---|---|
committer | kmacy <kmacy@FreeBSD.org> | 2007-03-02 07:21:20 +0000 |
commit | e1b1eae5923c01f8e3a48519bd065108ac5fad4d (patch) | |
tree | ebf400e9b11dfb845d138f5eed5195c04faef4a9 /sys/kern/kern_sx.c | |
parent | 2d1909f3b99f9a3cb7031477a90f9d71abd25e6d (diff) | |
download | FreeBSD-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.c | 27 |
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 |