summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2002-05-20 17:54:48 +0000
committerjhb <jhb@FreeBSD.org>2002-05-20 17:54:48 +0000
commitd53ecb9f8468a56cdc3909bc769d0da2a91be384 (patch)
tree3fdfe9d4e79dbfc11db77e36b1668b792f25db1c
parent4423d1f90a42798bc7f81936eefbcae74bcb0a63 (diff)
downloadFreeBSD-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.
-rw-r--r--sys/vm/uma_core.c7
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);
OpenPOWER on IntegriCloud