From df84cdbe06ddfd60e172e2f3d7ee2f7541c16f67 Mon Sep 17 00:00:00 2001 From: bmilekic Date: Sun, 4 Jul 2004 16:07:44 +0000 Subject: Introduce debug.nosleepwithlocks sysctl, 0 by default. If set to 1 and WITNESS is not built, then force all M_WAITOK allocations to M_NOWAIT behavior (transparently). This is to be used temporarily if wierd deadlocks are reported because we still have code paths that perform M_WAITOK allocations with lock(s) held, which can lead to deadlock. If WITNESS is compiled, then the sysctl is ignored and we ask witness to tell us wether we have locks held, converting to M_NOWAIT behavior only if it tells us that we do. Note this removes the previous mbuf.h inclusion as well (only needed by last revision), and cleans up unneeded [artificial] comparisons to just the mbuf zones. The problem described above has nothing to do with previous mbuf wait behavior; it is a general problem. --- sys/vm/uma_core.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/sys/vm/uma_core.c b/sys/vm/uma_core.c index 9e1f7d4..4b25a1b 100644 --- a/sys/vm/uma_core.c +++ b/sys/vm/uma_core.c @@ -68,7 +68,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include /* XXX WITNESS_WARN() hack */ #include #include @@ -225,6 +224,9 @@ void uma_print_zone(uma_zone_t); void uma_print_stats(void); static int sysctl_vm_zone(SYSCTL_HANDLER_ARGS); +static int nosleepwithlocks = 0; +SYSCTL_INT(_debug, OID_AUTO, nosleepwithlocks, CTLFLAG_RW, &nosleepwithlocks, + 0, "Convert M_WAITOK to M_NOWAIT to avoid lock-held-across-sleep paths"); SYSCTL_OID(_vm, OID_AUTO, zone, CTLTYPE_STRING|CTLFLAG_RD, NULL, 0, sysctl_vm_zone, "A", "Zone Info"); SYSINIT(uma_startup3, SI_SUB_VM_CONF, SI_ORDER_SECOND, uma_startup3, NULL); @@ -1603,7 +1605,7 @@ uma_zalloc_arg(uma_zone_t zone, void *udata, int flags) uma_cache_t cache; uma_bucket_t bucket; int cpu; - int badness = 0; + int badness; /* This is the fast path allocation */ #ifdef UMA_DEBUG_ALLOC_1 @@ -1613,16 +1615,12 @@ uma_zalloc_arg(uma_zone_t zone, void *udata, int flags) if (!(flags & M_NOWAIT)) { KASSERT(curthread->td_intr_nesting_level == 0, ("malloc(M_WAITOK) in interrupt context")); - if ((zone_mbuf != NULL && zone == zone_mbuf) || - (zone_clust != NULL && zone == zone_clust) || - (zone_pack != NULL && zone == zone_pack)) + badness = nosleepwithlocks; #ifdef WITNESS - badness = WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, - NULL, - "malloc(M_WAITOK) of \"%s\", forcing M_NOWAIT", - zone->uz_name); -#else - badness = 1; + badness = WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, + NULL, + "malloc(M_WAITOK) of \"%s\", forcing M_NOWAIT", + zone->uz_name); #endif if (badness) { flags &= ~M_WAITOK; -- cgit v1.1