summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2007-03-07 20:48:48 +0000
committerjhb <jhb@FreeBSD.org>2007-03-07 20:48:48 +0000
commitbe6311d7e9ed6a0c56de419a9feda69db957f6dc (patch)
treed49da454f306411ebbaf6604f8b7c4ee97f01b43
parent7012ad9bced6d6fecb14321966dbb5df316192f5 (diff)
downloadFreeBSD-src-be6311d7e9ed6a0c56de419a9feda69db957f6dc.zip
FreeBSD-src-be6311d7e9ed6a0c56de419a9feda69db957f6dc.tar.gz
Fix some nits in lock profiling for rwlocks:
- Properly note when a read lock is released. - Always note when we contest on a read lock. - Only note success of obtaining read locks for the first reader to match the behavior of sx(9). Reviewed by: kmacy
-rw-r--r--sys/kern/kern_rwlock.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/sys/kern/kern_rwlock.c b/sys/kern/kern_rwlock.c
index 9c7d4f8..274a448 100644
--- a/sys/kern/kern_rwlock.c
+++ b/sys/kern/kern_rwlock.c
@@ -150,7 +150,7 @@ _rw_rlock(struct rwlock *rw, const char *file, int line)
#ifdef SMP
volatile struct thread *owner;
#endif
- uint64_t waitstart = 0;
+ uint64_t waittime = 0;
int contested = 0;
uintptr_t x;
@@ -192,18 +192,22 @@ _rw_rlock(struct rwlock *rw, const char *file, int line)
MPASS((x & RW_LOCK_READ_WAITERS) == 0);
if (atomic_cmpset_acq_ptr(&rw->rw_lock, x,
x + RW_ONE_READER)) {
- lock_profile_obtain_lock_success(&rw->rw_object, contested, waitstart, file, line);
if (LOCK_LOG_TEST(&rw->rw_object, 0))
CTR4(KTR_LOCK,
"%s: %p succeed %p -> %p", __func__,
rw, (void *)x,
(void *)(x + RW_ONE_READER));
+ if (RW_READERS(x) == 0)
+ lock_profile_obtain_lock_success(
+ &rw->rw_object, contested, waittime,
+ file, line);
break;
}
- lock_profile_obtain_lock_failed(&rw->rw_object, &contested, &waitstart);
cpu_spinwait();
continue;
}
+ lock_profile_obtain_lock_failed(&rw->rw_object, &contested,
+ &waittime);
/*
* Okay, now it's the hard case. Some other thread already
@@ -250,7 +254,6 @@ _rw_rlock(struct rwlock *rw, const char *file, int line)
*/
owner = (struct thread *)RW_OWNER(x);
if (TD_IS_RUNNING(owner)) {
- lock_profile_obtain_lock_failed(&rw->rw_object, &contested, &waitstart);
turnstile_release(&rw->rw_object);
if (LOCK_LOG_TEST(&rw->rw_object, 0))
CTR3(KTR_LOCK, "%s: spinning on %p held by %p",
@@ -316,8 +319,7 @@ _rw_runlock(struct rwlock *rw, const char *file, int line)
break;
}
continue;
- } else
- lock_profile_release_lock(&rw->rw_object);
+ }
/*
@@ -401,6 +403,7 @@ _rw_runlock(struct rwlock *rw, const char *file, int line)
turnstile_unpend(ts, TS_SHARED_LOCK);
break;
}
+ lock_profile_release_lock(&rw->rw_object);
}
/*
OpenPOWER on IntegriCloud