Changeset View
Changeset View
Standalone View
Standalone View
sys/sys/epoch.h
Show All 39 Lines | |||||
#ifdef _KERNEL | #ifdef _KERNEL | ||||
#include <sys/lock.h> | #include <sys/lock.h> | ||||
#include <sys/pcpu.h> | #include <sys/pcpu.h> | ||||
#include <ck_epoch.h> | #include <ck_epoch.h> | ||||
struct epoch; | struct epoch; | ||||
typedef struct epoch *epoch_t; | typedef struct epoch *epoch_t; | ||||
#define EPOCH_TYPE_MASK (EPOCH_PREEMPT | EPOCH_SLEEPABLE) | |||||
#define EPOCH_CRITICAL 0x0 | |||||
#define EPOCH_PREEMPT 0x1 | #define EPOCH_PREEMPT 0x1 | ||||
#define EPOCH_LOCKED 0x2 | #define EPOCH_LOCKED 0x2 | ||||
#define EPOCH_SLEEPABLE 0x4 | |||||
#define EPOCH_RESERVED 0x5 | |||||
extern epoch_t global_epoch; | extern epoch_t global_epoch; | ||||
extern epoch_t global_epoch_preempt; | extern epoch_t global_epoch_preempt; | ||||
extern epoch_t global_epoch_sleepable; | |||||
struct epoch_tracker { | struct epoch_tracker { | ||||
TAILQ_ENTRY(epoch_tracker) et_link; | TAILQ_ENTRY(epoch_tracker) et_link; | ||||
struct thread *et_td; | struct thread *et_td; | ||||
ck_epoch_section_t et_section; | ck_epoch_section_t et_section; | ||||
uint8_t et_old_priority; | uint8_t et_old_priority; | ||||
#ifdef EPOCH_TRACE | #ifdef EPOCH_TRACE | ||||
struct epoch *et_epoch; | struct epoch *et_epoch; | ||||
SLIST_ENTRY(epoch_tracker) et_tlink; | SLIST_ENTRY(epoch_tracker) et_tlink; | ||||
const char *et_file; | const char *et_file; | ||||
int et_line; | int et_line; | ||||
#endif | #endif | ||||
} __aligned(sizeof(void *)); | } __aligned(sizeof(void *)); | ||||
typedef struct epoch_tracker *epoch_tracker_t; | typedef struct epoch_tracker *epoch_tracker_t; | ||||
epoch_t epoch_alloc(const char *name, int flags); | epoch_t epoch_alloc(const char *name, int flags); | ||||
void epoch_free(epoch_t epoch); | void epoch_free(epoch_t epoch); | ||||
void epoch_wait(epoch_t epoch); | void epoch_wait(epoch_t epoch); | ||||
void epoch_wait_preempt(epoch_t epoch); | void epoch_wait_preempt(epoch_t epoch); | ||||
void epoch_wait_sleepable(epoch_t epoch); | |||||
void epoch_drain_callbacks(epoch_t epoch); | void epoch_drain_callbacks(epoch_t epoch); | ||||
void epoch_call(epoch_t epoch, epoch_callback_t cb, epoch_context_t ctx); | void epoch_call(epoch_t epoch, epoch_callback_t cb, epoch_context_t ctx); | ||||
int in_epoch(epoch_t epoch); | int in_epoch(epoch_t epoch); | ||||
int in_epoch_verbose(epoch_t epoch, int dump_onfail); | int in_epoch_verbose(epoch_t epoch, int dump_onfail); | ||||
DPCPU_DECLARE(int, epoch_cb_count); | DPCPU_DECLARE(int, epoch_cb_count); | ||||
DPCPU_DECLARE(struct grouptask, epoch_cb_task); | DPCPU_DECLARE(struct grouptask, epoch_cb_task); | ||||
#ifdef EPOCH_TRACE | #ifdef EPOCH_TRACE | ||||
#define EPOCH_FILE_LINE , const char *file, int line | #define EPOCH_FILE_LINE , const char *file, int line | ||||
#else | #else | ||||
#define EPOCH_FILE_LINE | #define EPOCH_FILE_LINE | ||||
#endif | #endif | ||||
void _epoch_enter_preempt(epoch_t epoch, epoch_tracker_t et EPOCH_FILE_LINE); | void _epoch_enter_preempt(epoch_t epoch, epoch_tracker_t et EPOCH_FILE_LINE); | ||||
void _epoch_exit_preempt(epoch_t epoch, epoch_tracker_t et EPOCH_FILE_LINE); | void _epoch_exit_preempt(epoch_t epoch, epoch_tracker_t et EPOCH_FILE_LINE); | ||||
void _epoch_enter_sleepable(epoch_t epoch, epoch_tracker_t et EPOCH_FILE_LINE); | |||||
void _epoch_exit_sleepable(epoch_t epoch, epoch_tracker_t et EPOCH_FILE_LINE); | |||||
#ifdef EPOCH_TRACE | #ifdef EPOCH_TRACE | ||||
void epoch_trace_list(struct thread *); | void epoch_trace_list(struct thread *); | ||||
#define epoch_enter_preempt(epoch, et) _epoch_enter_preempt(epoch, et, __FILE__, __LINE__) | #define epoch_enter_preempt(epoch, et) _epoch_enter_preempt(epoch, et, __FILE__, __LINE__) | ||||
#define epoch_exit_preempt(epoch, et) _epoch_exit_preempt(epoch, et, __FILE__, __LINE__) | #define epoch_exit_preempt(epoch, et) _epoch_exit_preempt(epoch, et, __FILE__, __LINE__) | ||||
#define epoch_enter_sleepable(epoch, et) _epoch_enter_sleepable(epoch, et, __FILE__, __LINE__) | |||||
#define epoch_exit_sleepable(epoch, et) _epoch_exit_sleepable(epoch, et, __FILE__, __LINE__) | |||||
#else | #else | ||||
#define epoch_enter_preempt(epoch, et) _epoch_enter_preempt(epoch, et) | #define epoch_enter_preempt(epoch, et) _epoch_enter_preempt(epoch, et) | ||||
#define epoch_exit_preempt(epoch, et) _epoch_exit_preempt(epoch, et) | #define epoch_exit_preempt(epoch, et) _epoch_exit_preempt(epoch, et) | ||||
#define epoch_enter_sleepable(epoch, et) _epoch_enter_sleepable(epoch, et) | |||||
#define epoch_exit_sleepable(epoch, et) _epoch_exit_sleepable(epoch, et) | |||||
#endif | #endif | ||||
void epoch_enter(epoch_t epoch); | void epoch_enter(epoch_t epoch); | ||||
void epoch_exit(epoch_t epoch); | void epoch_exit(epoch_t epoch); | ||||
/* | /* | ||||
* Globally recognized epochs in the FreeBSD kernel. | * Globally recognized epochs in the FreeBSD kernel. | ||||
*/ | */ | ||||
/* Network preemptible epoch, declared in sys/net/if.c. */ | /* Network preemptible epoch, declared in sys/net/if.c. */ | ||||
extern epoch_t net_epoch_preempt; | extern epoch_t net_epoch_preempt; | ||||
Show All 11 Lines |