Changeset View
Changeset View
Standalone View
Standalone View
head/sys/kern/kern_shutdown.c
Show First 20 Lines • Show All 646 Lines • ▼ Show 20 Lines | |||||
static int kassert_log_pps_limit = 4; | static int kassert_log_pps_limit = 4; | ||||
static int kassert_log_mute_at = 0; | static int kassert_log_mute_at = 0; | ||||
static int kassert_log_panic_at = 0; | static int kassert_log_panic_at = 0; | ||||
static int kassert_suppress_in_panic = 0; | static int kassert_suppress_in_panic = 0; | ||||
static int kassert_warnings = 0; | static int kassert_warnings = 0; | ||||
SYSCTL_NODE(_debug, OID_AUTO, kassert, CTLFLAG_RW, NULL, "kassert options"); | SYSCTL_NODE(_debug, OID_AUTO, kassert, CTLFLAG_RW, NULL, "kassert options"); | ||||
SYSCTL_INT(_debug_kassert, OID_AUTO, warn_only, CTLFLAG_RWTUN, | #ifdef KASSERT_PANIC_OPTIONAL | ||||
#define KASSERT_RWTUN CTLFLAG_RWTUN | |||||
#else | |||||
#define KASSERT_RWTUN CTLFLAG_RDTUN | |||||
#endif | |||||
SYSCTL_INT(_debug_kassert, OID_AUTO, warn_only, KASSERT_RWTUN, | |||||
&kassert_warn_only, 0, | &kassert_warn_only, 0, | ||||
"KASSERT triggers a panic (1) or just a warning (0)"); | "KASSERT triggers a panic (0) or just a warning (1)"); | ||||
#ifdef KDB | #ifdef KDB | ||||
SYSCTL_INT(_debug_kassert, OID_AUTO, do_kdb, CTLFLAG_RWTUN, | SYSCTL_INT(_debug_kassert, OID_AUTO, do_kdb, KASSERT_RWTUN, | ||||
&kassert_do_kdb, 0, "KASSERT will enter the debugger"); | &kassert_do_kdb, 0, "KASSERT will enter the debugger"); | ||||
#endif | #endif | ||||
#ifdef KTR | #ifdef KTR | ||||
SYSCTL_UINT(_debug_kassert, OID_AUTO, do_ktr, CTLFLAG_RWTUN, | SYSCTL_UINT(_debug_kassert, OID_AUTO, do_ktr, KASSERT_RWTUN, | ||||
&kassert_do_ktr, 0, | &kassert_do_ktr, 0, | ||||
"KASSERT does a KTR, set this to the KTRMASK you want"); | "KASSERT does a KTR, set this to the KTRMASK you want"); | ||||
#endif | #endif | ||||
SYSCTL_INT(_debug_kassert, OID_AUTO, do_log, CTLFLAG_RWTUN, | SYSCTL_INT(_debug_kassert, OID_AUTO, do_log, KASSERT_RWTUN, | ||||
&kassert_do_log, 0, | &kassert_do_log, 0, | ||||
"If warn_only is enabled, log (1) or do not log (0) assertion violations"); | "If warn_only is enabled, log (1) or do not log (0) assertion violations"); | ||||
SYSCTL_INT(_debug_kassert, OID_AUTO, warnings, CTLFLAG_RWTUN, | SYSCTL_INT(_debug_kassert, OID_AUTO, warnings, KASSERT_RWTUN, | ||||
&kassert_warnings, 0, "number of KASSERTs that have been triggered"); | &kassert_warnings, 0, "number of KASSERTs that have been triggered"); | ||||
SYSCTL_INT(_debug_kassert, OID_AUTO, log_panic_at, CTLFLAG_RWTUN, | SYSCTL_INT(_debug_kassert, OID_AUTO, log_panic_at, KASSERT_RWTUN, | ||||
&kassert_log_panic_at, 0, "max number of KASSERTS before we will panic"); | &kassert_log_panic_at, 0, "max number of KASSERTS before we will panic"); | ||||
SYSCTL_INT(_debug_kassert, OID_AUTO, log_pps_limit, CTLFLAG_RWTUN, | SYSCTL_INT(_debug_kassert, OID_AUTO, log_pps_limit, KASSERT_RWTUN, | ||||
&kassert_log_pps_limit, 0, "limit number of log messages per second"); | &kassert_log_pps_limit, 0, "limit number of log messages per second"); | ||||
SYSCTL_INT(_debug_kassert, OID_AUTO, log_mute_at, CTLFLAG_RWTUN, | SYSCTL_INT(_debug_kassert, OID_AUTO, log_mute_at, KASSERT_RWTUN, | ||||
&kassert_log_mute_at, 0, "max number of KASSERTS to log"); | &kassert_log_mute_at, 0, "max number of KASSERTS to log"); | ||||
SYSCTL_INT(_debug_kassert, OID_AUTO, suppress_in_panic, CTLFLAG_RWTUN, | SYSCTL_INT(_debug_kassert, OID_AUTO, suppress_in_panic, KASSERT_RWTUN, | ||||
&kassert_suppress_in_panic, 0, | &kassert_suppress_in_panic, 0, | ||||
"KASSERTs will be suppressed while handling a panic"); | "KASSERTs will be suppressed while handling a panic"); | ||||
#undef KASSERT_RWTUN | |||||
static int kassert_sysctl_kassert(SYSCTL_HANDLER_ARGS); | static int kassert_sysctl_kassert(SYSCTL_HANDLER_ARGS); | ||||
SYSCTL_PROC(_debug_kassert, OID_AUTO, kassert, | SYSCTL_PROC(_debug_kassert, OID_AUTO, kassert, | ||||
CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_SECURE, NULL, 0, | CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_SECURE, NULL, 0, | ||||
kassert_sysctl_kassert, "I", "set to trigger a test kassert"); | kassert_sysctl_kassert, "I", "set to trigger a test kassert"); | ||||
static int | static int | ||||
kassert_sysctl_kassert(SYSCTL_HANDLER_ARGS) | kassert_sysctl_kassert(SYSCTL_HANDLER_ARGS) | ||||
{ | { | ||||
int error, i; | int error, i; | ||||
error = sysctl_wire_old_buffer(req, sizeof(int)); | error = sysctl_wire_old_buffer(req, sizeof(int)); | ||||
if (error == 0) { | if (error == 0) { | ||||
i = 0; | i = 0; | ||||
error = sysctl_handle_int(oidp, &i, 0, req); | error = sysctl_handle_int(oidp, &i, 0, req); | ||||
} | } | ||||
if (error != 0 || req->newptr == NULL) | if (error != 0 || req->newptr == NULL) | ||||
return (error); | return (error); | ||||
KASSERT(0, ("kassert_sysctl_kassert triggered kassert %d", i)); | KASSERT(0, ("kassert_sysctl_kassert triggered kassert %d", i)); | ||||
return (0); | return (0); | ||||
} | } | ||||
#ifdef KASSERT_PANIC_OPTIONAL | |||||
/* | /* | ||||
* Called by KASSERT, this decides if we will panic | * Called by KASSERT, this decides if we will panic | ||||
* or if we will log via printf and/or ktr. | * or if we will log via printf and/or ktr. | ||||
*/ | */ | ||||
void | void | ||||
kassert_panic(const char *fmt, ...) | kassert_panic(const char *fmt, ...) | ||||
{ | { | ||||
static char buf[256]; | static char buf[256]; | ||||
▲ Show 20 Lines • Show All 49 Lines • ▼ Show 20 Lines | #endif /* KTR */ | ||||
} | } | ||||
#ifdef KDB | #ifdef KDB | ||||
if (kassert_do_kdb) { | if (kassert_do_kdb) { | ||||
kdb_enter(KDB_WHY_KASSERT, buf); | kdb_enter(KDB_WHY_KASSERT, buf); | ||||
} | } | ||||
#endif | #endif | ||||
atomic_add_int(&kassert_warnings, 1); | atomic_add_int(&kassert_warnings, 1); | ||||
} | } | ||||
#endif /* KASSERT_PANIC_OPTIONAL */ | |||||
#endif | #endif | ||||
/* | /* | ||||
* Panic is called on unresolvable fatal errors. It prints "panic: mesg", | * Panic is called on unresolvable fatal errors. It prints "panic: mesg", | ||||
* and then reboots. If we are called twice, then we avoid trying to sync | * and then reboots. If we are called twice, then we avoid trying to sync | ||||
* the disks as this often leads to recursive panics. | * the disks as this often leads to recursive panics. | ||||
*/ | */ | ||||
void | void | ||||
▲ Show 20 Lines • Show All 787 Lines • Show Last 20 Lines |