diff options
author | jhb <jhb@FreeBSD.org> | 2001-05-11 20:25:29 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2001-05-11 20:25:29 +0000 |
commit | 2290c1ae6c6b2a7768053edc2aa9708e3c8a10d3 (patch) | |
tree | a9a085506042f2eaba3dcb5f40d8421ff6ae2b2a /sys/kern/subr_witness.c | |
parent | 5fd005f3e969188a8cae849a4cb83d40c55d0348 (diff) | |
download | FreeBSD-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.c | 19 |
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, |