FreeBSD kernel kern code
|
#include <sys/cdefs.h>
#include "opt_ddb.h"
#include "opt_kdtrace.h"
#include "opt_turnstile_profiling.h"
#include "opt_sched.h"
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kdb.h>
#include <sys/kernel.h>
#include <sys/ktr.h>
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/proc.h>
#include <sys/queue.h>
#include <sys/sched.h>
#include <sys/sdt.h>
#include <sys/sysctl.h>
#include <sys/turnstile.h>
#include <vm/uma.h>
Go to the source code of this file.
Data Structures | |
struct | turnstile |
struct | turnstile_chain |
Macros | |
#define | TC_TABLESIZE 128 /* Must be power of 2. */ |
#define | TC_MASK (TC_TABLESIZE - 1) |
#define | TC_SHIFT 8 |
#define | TC_HASH(lock) (((uintptr_t)(lock) >> TC_SHIFT) & TC_MASK) |
#define | TC_LOOKUP(lock) &turnstile_chains[TC_HASH(lock)] |
Functions | |
__FBSDID ("$BSDSUniX$") | |
static void | init_turnstile0 (void *dummy) |
static void | propagate_priority (struct thread *td) |
static int | turnstile_adjust_thread (struct turnstile *ts, struct thread *td) |
static struct thread * | turnstile_first_waiter (struct turnstile *ts) |
static void | turnstile_setowner (struct turnstile *ts, struct thread *owner) |
static int | turnstile_init (void *mem, int size, int flags) |
static void | turnstile_fini (void *mem, int size) |
SDT_PROVIDER_DECLARE (sched) | |
SDT_PROBE_DEFINE (sched,,, sleep) | |
SDT_PROBE_DEFINE2 (sched,,, wakeup,"struct thread *","struct proc *") | |
void | init_turnstiles (void) |
SYSINIT (turnstile0, SI_SUB_LOCK, SI_ORDER_ANY, init_turnstile0, NULL) | |
void | turnstile_adjust (struct thread *td, u_char oldpri) |
struct turnstile * | turnstile_alloc (void) |
void | turnstile_free (struct turnstile *ts) |
void | turnstile_chain_lock (struct lock_object *lock) |
struct turnstile * | turnstile_trywait (struct lock_object *lock) |
void | turnstile_cancel (struct turnstile *ts) |
struct turnstile * | turnstile_lookup (struct lock_object *lock) |
void | turnstile_chain_unlock (struct lock_object *lock) |
void | turnstile_claim (struct turnstile *ts) |
void | turnstile_wait (struct turnstile *ts, struct thread *owner, int queue) |
int | turnstile_signal (struct turnstile *ts, int queue) |
void | turnstile_broadcast (struct turnstile *ts, int queue) |
void | turnstile_unpend (struct turnstile *ts, int owner_type) |
void | turnstile_disown (struct turnstile *ts) |
struct thread * | turnstile_head (struct turnstile *ts, int queue) |
int | turnstile_empty (struct turnstile *ts, int queue) |
Variables | |
static struct mtx | td_contested_lock |
static struct turnstile_chain | turnstile_chains [TC_TABLESIZE] |
static uma_zone_t | turnstile_zone |
Definition at line 98 of file subr_turnstile.c.
#define TC_LOOKUP | ( | lock | ) | &turnstile_chains[TC_HASH(lock)] |
Definition at line 99 of file subr_turnstile.c.
Referenced by turnstile_broadcast(), turnstile_cancel(), turnstile_chain_lock(), turnstile_chain_unlock(), turnstile_claim(), turnstile_lookup(), turnstile_signal(), turnstile_trywait(), and turnstile_wait().
#define TC_MASK (TC_TABLESIZE - 1) |
Definition at line 96 of file subr_turnstile.c.
#define TC_SHIFT 8 |
Definition at line 97 of file subr_turnstile.c.
#define TC_TABLESIZE 128 /* Must be power of 2. */ |
Definition at line 95 of file subr_turnstile.c.
Referenced by init_turnstiles().
__FBSDID | ( | "$BSDSUniX$" | ) |
|
static |
Definition at line 401 of file subr_turnstile.c.
References turnstile_alloc(), turnstile_fini(), and turnstile_init().
void init_turnstiles | ( | void | ) |
Definition at line 361 of file subr_turnstile.c.
References mtx_init(), TC_TABLESIZE, td_contested_lock, and turnstile_chains.
Referenced by mutex_init().
|
static |
Definition at line 183 of file subr_turnstile.c.
References kdb_backtrace_thread(), panic(), printf(), sched_lend_prio(), ts, turnstile::ts_lock, and turnstile_adjust_thread().
Referenced by turnstile_adjust(), and turnstile_wait().
SDT_PROBE_DEFINE | ( | sched | , |
sleep | |||
) |
SDT_PROBE_DEFINE2 | ( | sched | , |
wakeup | , | ||
"struct thread *" | , | ||
"struct proc *" | |||
) |
SDT_PROVIDER_DECLARE | ( | sched | ) |
SYSINIT | ( | turnstile0 | , |
SI_SUB_LOCK | , | ||
SI_ORDER_ANY | , | ||
init_turnstile0 | , | ||
NULL | |||
) |
void turnstile_adjust | ( | struct thread * | td, |
u_char | oldpri | ||
) |
Definition at line 421 of file subr_turnstile.c.
References propagate_priority(), ts, turnstile::ts_blocked, turnstile::ts_lock, and turnstile_adjust_thread().
Referenced by sched_prio().
|
static |
Definition at line 291 of file subr_turnstile.c.
References td_contested_lock, turnstile::ts_blocked, and turnstile::ts_lock.
Referenced by propagate_priority(), and turnstile_adjust().
struct turnstile* turnstile_alloc | ( | void | ) |
Definition at line 518 of file subr_turnstile.c.
Referenced by init_turnstile0(), and thread_init().
void turnstile_broadcast | ( | struct turnstile * | ts, |
int | queue | ||
) |
Definition at line 817 of file subr_turnstile.c.
References TC_LOOKUP, td_contested_lock, ts, turnstile::ts_blocked, turnstile::ts_lock, and turnstile::ts_pending.
Referenced by _mtx_unlock_sleep(), _rw_downgrade(), _rw_runlock(), and _rw_wunlock_hard().
void turnstile_cancel | ( | struct turnstile * | ts | ) |
Definition at line 570 of file subr_turnstile.c.
References TC_LOOKUP, and turnstile::ts_lock.
Referenced by _mtx_lock_sleep(), _rw_rlock(), _rw_try_upgrade(), and _rw_wlock_hard().
void turnstile_chain_lock | ( | struct lock_object * | lock | ) |
Definition at line 538 of file subr_turnstile.c.
References TC_LOOKUP.
Referenced by _mtx_unlock_sleep(), _rm_unlock_hard(), _rw_downgrade(), _rw_runlock(), and _rw_wunlock_hard().
void turnstile_chain_unlock | ( | struct lock_object * | lock | ) |
Definition at line 610 of file subr_turnstile.c.
References TC_LOOKUP.
Referenced by _mtx_unlock_sleep(), _rm_unlock_hard(), _rw_downgrade(), _rw_runlock(), and _rw_wunlock_hard().
void turnstile_claim | ( | struct turnstile * | ts | ) |
Definition at line 639 of file subr_turnstile.c.
References sched_lend_prio(), TC_LOOKUP, td_contested_lock, turnstile::ts_lock, turnstile_first_waiter(), and turnstile_setowner().
Referenced by _rw_try_upgrade(), and _rw_wlock_hard().
void turnstile_disown | ( | struct turnstile * | ts | ) |
Definition at line 952 of file subr_turnstile.c.
References sched_unlend_prio(), td_contested_lock, turnstile::ts_blocked, turnstile::ts_lock, turnstile::ts_pending, and turnstile_first_waiter().
Referenced by _rw_downgrade().
int turnstile_empty | ( | struct turnstile * | ts, |
int | queue | ||
) |
Definition at line 1014 of file subr_turnstile.c.
References turnstile::ts_blocked, and turnstile::ts_lock.
|
static |
Definition at line 506 of file subr_turnstile.c.
References mtx_destroy(), ts, and turnstile::ts_lock.
Referenced by init_turnstile0().
|
static |
Definition at line 623 of file subr_turnstile.c.
References turnstile::ts_blocked.
Referenced by turnstile_claim(), turnstile_disown(), and turnstile_unpend().
void turnstile_free | ( | struct turnstile * | ts | ) |
Definition at line 528 of file subr_turnstile.c.
Referenced by thread_fini().
struct thread* turnstile_head | ( | struct turnstile * | ts, |
int | queue | ||
) |
Definition at line 999 of file subr_turnstile.c.
References turnstile::ts_blocked, and turnstile::ts_lock.
|
static |
Definition at line 491 of file subr_turnstile.c.
References mtx_init(), ts, turnstile::ts_blocked, turnstile::ts_lock, and turnstile::ts_pending.
Referenced by init_turnstile0().
struct turnstile* turnstile_lookup | ( | struct lock_object * | lock | ) |
Definition at line 591 of file subr_turnstile.c.
References TC_LOOKUP, ts, and turnstile::ts_lock.
Referenced by _mtx_unlock_sleep(), _rm_unlock_hard(), _rw_downgrade(), _rw_runlock(), and _rw_wunlock_hard().
|
static |
Definition at line 456 of file subr_turnstile.c.
References td_contested_lock.
Referenced by turnstile_claim(), and turnstile_wait().
int turnstile_signal | ( | struct turnstile * | ts, |
int | queue | ||
) |
Definition at line 766 of file subr_turnstile.c.
References empty, TC_LOOKUP, td_contested_lock, ts, turnstile::ts_blocked, turnstile::ts_lock, and turnstile::ts_pending.
Referenced by _rm_unlock_hard().
struct turnstile* turnstile_trywait | ( | struct lock_object * | lock | ) |
Definition at line 547 of file subr_turnstile.c.
References TC_LOOKUP, ts, and turnstile::ts_lock.
Referenced by _mtx_lock_sleep(), _rm_wlock(), _rw_rlock(), _rw_try_upgrade(), and _rw_wlock_hard().
void turnstile_unpend | ( | struct turnstile * | ts, |
int | owner_type | ||
) |
Definition at line 867 of file subr_turnstile.c.
References sched_add(), sched_unlend_prio(), TAILQ_HEAD(), td_contested_lock, turnstile::ts_blocked, turnstile::ts_lock, turnstile::ts_pending, turnstile_first_waiter(), and wakeup().
Referenced by _mtx_unlock_sleep(), _rm_unlock_hard(), _rw_downgrade(), _rw_runlock(), and _rw_wunlock_hard().
void turnstile_wait | ( | struct turnstile * | ts, |
struct thread * | owner, | ||
int | queue | ||
) |
Definition at line 676 of file subr_turnstile.c.
References mi_switch(), propagate_priority(), TC_LOOKUP, td_contested_lock, thread_lock_set(), ticks, ts, turnstile::ts_blocked, turnstile::ts_lock, turnstile::ts_pending, and turnstile_setowner().
Referenced by _mtx_lock_sleep(), _rm_wlock(), _rw_rlock(), and _rw_wlock_hard().
|
static |
Definition at line 150 of file subr_turnstile.c.
Referenced by init_turnstiles(), turnstile_adjust_thread(), turnstile_broadcast(), turnstile_claim(), turnstile_disown(), turnstile_setowner(), turnstile_signal(), turnstile_unpend(), and turnstile_wait().
|
static |
Definition at line 151 of file subr_turnstile.c.
Referenced by init_turnstiles().
|
static |
Definition at line 152 of file subr_turnstile.c.