summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_witness.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2001-05-11 20:25:29 +0000
committerjhb <jhb@FreeBSD.org>2001-05-11 20:25:29 +0000
commit2290c1ae6c6b2a7768053edc2aa9708e3c8a10d3 (patch)
treea9a085506042f2eaba3dcb5f40d8421ff6ae2b2a /sys/kern/subr_witness.c
parent5fd005f3e969188a8cae849a4cb83d40c55d0348 (diff)
downloadFreeBSD-src-2290c1ae6c6b2a7768053edc2aa9708e3c8a10d3.zip
FreeBSD-src-2290c1ae6c6b2a7768053edc2aa9708e3c8a10d3.tar.gz
Check witness_dead in more functions to avoid panic'ing when assertions
fail due to witness exhausting its internal resources and shutting down. Reported by: Szilveszter Adam <sziszi@petra.hos.u-szeged.hu> Tested by: David Wolfskill <david@catwhisker.org>
Diffstat (limited to 'sys/kern/subr_witness.c')
-rw-r--r--sys/kern/subr_witness.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/sys/kern/subr_witness.c b/sys/kern/subr_witness.c
index a44cb44..de354c1 100644
--- a/sys/kern/subr_witness.c
+++ b/sys/kern/subr_witness.c
@@ -826,7 +826,7 @@ enroll(const char *description, struct lock_class *lock_class)
{
struct witness *w;
- if (!witness_watch)
+ if (!witness_watch || witness_dead)
return (NULL);
if ((lock_class->lc_flags & LC_SPINLOCK) && witness_skipspin)
@@ -1097,6 +1097,10 @@ witness_get(void)
{
struct witness *w;
+ if (witness_dead) {
+ mtx_unlock_spin(&w_mtx);
+ return (NULL);
+ }
if (STAILQ_EMPTY(&w_free)) {
witness_dead = 1;
mtx_unlock_spin(&w_mtx);
@@ -1121,6 +1125,10 @@ witness_child_get(void)
{
struct witness_child_list_entry *wcl;
+ if (witness_dead) {
+ mtx_unlock_spin(&w_mtx);
+ return (NULL);
+ }
wcl = w_child_free;
if (wcl == NULL) {
witness_dead = 1;
@@ -1146,6 +1154,8 @@ witness_lock_list_get(void)
{
struct lock_list_entry *lle;
+ if (witness_dead)
+ return (NULL);
mtx_lock_spin(&w_mtx);
lle = w_lock_list_free;
if (lle == NULL) {
@@ -1222,6 +1232,9 @@ witness_list(struct proc *p)
("%s: p != curproc and we aren't in the debugger", __func__));
KASSERT(!witness_cold, ("%s: witness_cold", __func__));
+ if (!db_active && witness_dead)
+ return (0);
+
nheld = witness_list_locks(&p->p_sleeplocks);
/*
@@ -1250,7 +1263,7 @@ witness_save(struct lock_object *lock, const char **filep, int *linep)
struct lock_instance *instance;
KASSERT(!witness_cold, ("%s: witness_cold\n", __func__));
- if (lock->lo_witness == NULL)
+ if (lock->lo_witness == NULL || witness_dead)
return;
KASSERT(lock->lo_class->lc_flags & LC_SLEEPLOCK,
@@ -1270,7 +1283,7 @@ witness_restore(struct lock_object *lock, const char *file, int line)
struct lock_instance *instance;
KASSERT(!witness_cold, ("%s: witness_cold\n", __func__));
- if (lock->lo_witness == NULL)
+ if (lock->lo_witness == NULL || witness_dead)
return;
KASSERT(lock->lo_class->lc_flags & LC_SLEEPLOCK,
OpenPOWER on IntegriCloud