Changeset View
Changeset View
Standalone View
Standalone View
head/sys/kern/kern_mutex.c
Show First 20 Lines • Show All 467 Lines • ▼ Show 20 Lines | |||||
__mtx_lock_sleep(volatile uintptr_t *c, uintptr_t v) | __mtx_lock_sleep(volatile uintptr_t *c, uintptr_t v) | ||||
#endif | #endif | ||||
{ | { | ||||
struct thread *td; | struct thread *td; | ||||
struct mtx *m; | struct mtx *m; | ||||
struct turnstile *ts; | struct turnstile *ts; | ||||
uintptr_t tid; | uintptr_t tid; | ||||
struct thread *owner; | struct thread *owner; | ||||
#ifdef KTR | |||||
int cont_logged = 0; | |||||
#endif | |||||
#ifdef LOCK_PROFILING | #ifdef LOCK_PROFILING | ||||
int contested = 0; | int contested = 0; | ||||
uint64_t waittime = 0; | uint64_t waittime = 0; | ||||
#endif | #endif | ||||
#if defined(ADAPTIVE_MUTEXES) || defined(KDTRACE_HOOKS) | #if defined(ADAPTIVE_MUTEXES) || defined(KDTRACE_HOOKS) | ||||
struct lock_delay_arg lda; | struct lock_delay_arg lda; | ||||
#endif | #endif | ||||
#ifdef KDTRACE_HOOKS | #ifdef KDTRACE_HOOKS | ||||
▲ Show 20 Lines • Show All 137 Lines • ▼ Show 20 Lines | if ((v & MTX_CONTESTED) == 0 && | ||||
goto retry_turnstile; | goto retry_turnstile; | ||||
} | } | ||||
/* | /* | ||||
* We definitely must sleep for this lock. | * We definitely must sleep for this lock. | ||||
*/ | */ | ||||
mtx_assert(m, MA_NOTOWNED); | mtx_assert(m, MA_NOTOWNED); | ||||
#ifdef KTR | |||||
if (!cont_logged) { | |||||
CTR6(KTR_CONTENTION, | |||||
"contention: %p at %s:%d wants %s, taken by %s:%d", | |||||
(void *)tid, file, line, m->lock_object.lo_name, | |||||
WITNESS_FILE(&m->lock_object), | |||||
WITNESS_LINE(&m->lock_object)); | |||||
cont_logged = 1; | |||||
} | |||||
#endif | |||||
/* | /* | ||||
* Block on the turnstile. | * Block on the turnstile. | ||||
*/ | */ | ||||
#ifdef KDTRACE_HOOKS | #ifdef KDTRACE_HOOKS | ||||
sleep_time -= lockstat_nsecs(&m->lock_object); | sleep_time -= lockstat_nsecs(&m->lock_object); | ||||
#endif | #endif | ||||
#ifndef ADAPTIVE_MUTEXES | #ifndef ADAPTIVE_MUTEXES | ||||
owner = mtx_owner(m); | owner = mtx_owner(m); | ||||
#endif | #endif | ||||
MPASS(owner == mtx_owner(m)); | MPASS(owner == mtx_owner(m)); | ||||
turnstile_wait(ts, owner, TS_EXCLUSIVE_QUEUE); | turnstile_wait(ts, owner, TS_EXCLUSIVE_QUEUE); | ||||
#ifdef KDTRACE_HOOKS | #ifdef KDTRACE_HOOKS | ||||
sleep_time += lockstat_nsecs(&m->lock_object); | sleep_time += lockstat_nsecs(&m->lock_object); | ||||
sleep_cnt++; | sleep_cnt++; | ||||
#endif | #endif | ||||
v = MTX_READ_VALUE(m); | v = MTX_READ_VALUE(m); | ||||
} | } | ||||
#ifdef KTR | |||||
if (cont_logged) { | |||||
CTR4(KTR_CONTENTION, | |||||
"contention end: %s acquired by %p at %s:%d", | |||||
m->lock_object.lo_name, (void *)tid, file, line); | |||||
} | |||||
#endif | |||||
#if defined(KDTRACE_HOOKS) || defined(LOCK_PROFILING) | #if defined(KDTRACE_HOOKS) || defined(LOCK_PROFILING) | ||||
if (__predict_true(!doing_lockprof)) | if (__predict_true(!doing_lockprof)) | ||||
return; | return; | ||||
#endif | #endif | ||||
#ifdef KDTRACE_HOOKS | #ifdef KDTRACE_HOOKS | ||||
all_time += lockstat_nsecs(&m->lock_object); | all_time += lockstat_nsecs(&m->lock_object); | ||||
if (sleep_time) | if (sleep_time) | ||||
LOCKSTAT_RECORD1(adaptive__block, m, sleep_time); | LOCKSTAT_RECORD1(adaptive__block, m, sleep_time); | ||||
▲ Show 20 Lines • Show All 639 Lines • Show Last 20 Lines |