diff options
author | jhb <jhb@FreeBSD.org> | 2002-05-20 17:54:48 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2002-05-20 17:54:48 +0000 |
commit | d53ecb9f8468a56cdc3909bc769d0da2a91be384 (patch) | |
tree | 3fdfe9d4e79dbfc11db77e36b1668b792f25db1c /sys/vm | |
parent | 4423d1f90a42798bc7f81936eefbcae74bcb0a63 (diff) | |
download | FreeBSD-src-d53ecb9f8468a56cdc3909bc769d0da2a91be384.zip FreeBSD-src-d53ecb9f8468a56cdc3909bc769d0da2a91be384.tar.gz |
In uma_zalloc_arg(), if we are performing a M_WAITOK allocation, ensure
that td_intr_nesting_level is 0 (like malloc() does). Since malloc() calls
uma we can probably remove the check in malloc() for this now. Also,
perform an extra witness check in that case to make sure we don't hold
any locks when performing a M_WAITOK allocation.
Diffstat (limited to 'sys/vm')
-rw-r--r-- | sys/vm/uma_core.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/sys/vm/uma_core.c b/sys/vm/uma_core.c index df79668..c6924b0 100644 --- a/sys/vm/uma_core.c +++ b/sys/vm/uma_core.c @@ -66,6 +66,7 @@ #include <sys/lock.h> #include <sys/sysctl.h> #include <sys/mutex.h> +#include <sys/proc.h> #include <sys/smp.h> #include <sys/vmmeter.h> @@ -1317,6 +1318,12 @@ uma_zalloc_arg(uma_zone_t zone, void *udata, int flags) printf("Allocating one item from %s(%p)\n", zone->uz_name, zone); #endif + if (!(flags & M_NOWAIT)) { + KASSERT(curthread->td_intr_nesting_level == 0, + ("malloc(M_WAITOK) in interrupt context")); + WITNESS_SLEEP(1, NULL); + } + zalloc_restart: cpu = PCPU_GET(cpuid); CPU_LOCK(zone, cpu); |