rwlock: reduce lockstat branches in the slowpath

MFC after:	1 week
This commit is contained in:
Mateusz Guzik 2017-10-20 03:32:42 +00:00
parent d41742b585
commit 2567807c32
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=324787

View File

@ -847,6 +847,9 @@ __rw_wlock_hard(volatile uintptr_t *c, uintptr_t v, uintptr_t tid,
int64_t sleep_time = 0; int64_t sleep_time = 0;
int64_t all_time = 0; int64_t all_time = 0;
#endif #endif
#if defined(KDTRACE_HOOKS) || defined(LOCK_PROFILING)
int doing_lockprof;
#endif
if (SCHEDULER_STOPPED()) if (SCHEDULER_STOPPED())
return; return;
@ -875,10 +878,17 @@ __rw_wlock_hard(volatile uintptr_t *c, uintptr_t v, uintptr_t tid,
CTR5(KTR_LOCK, "%s: %s contested (lock=%p) at %s:%d", __func__, CTR5(KTR_LOCK, "%s: %s contested (lock=%p) at %s:%d", __func__,
rw->lock_object.lo_name, (void *)rw->rw_lock, file, line); rw->lock_object.lo_name, (void *)rw->rw_lock, file, line);
#ifdef KDTRACE_HOOKS #ifdef LOCK_PROFILING
all_time -= lockstat_nsecs(&rw->lock_object); doing_lockprof = 1;
state = v; state = v;
#elif defined(KDTRACE_HOOKS)
doing_lockprof = lockstat_enabled;
if (__predict_false(doing_lockprof)) {
all_time -= lockstat_nsecs(&rw->lock_object);
state = v;
}
#endif #endif
for (;;) { for (;;) {
if (v == RW_UNLOCKED) { if (v == RW_UNLOCKED) {
if (_rw_write_lock_fetch(rw, &v, tid)) if (_rw_write_lock_fetch(rw, &v, tid))
@ -1024,6 +1034,10 @@ __rw_wlock_hard(volatile uintptr_t *c, uintptr_t v, uintptr_t tid,
#endif #endif
v = RW_READ_VALUE(rw); v = RW_READ_VALUE(rw);
} }
#if defined(KDTRACE_HOOKS) || defined(LOCK_PROFILING)
if (__predict_true(!doing_lockprof))
return;
#endif
#ifdef KDTRACE_HOOKS #ifdef KDTRACE_HOOKS
all_time += lockstat_nsecs(&rw->lock_object); all_time += lockstat_nsecs(&rw->lock_object);
if (sleep_time) if (sleep_time)