summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
authorbmilekic <bmilekic@FreeBSD.org>2004-06-23 21:59:03 +0000
committerbmilekic <bmilekic@FreeBSD.org>2004-06-23 21:59:03 +0000
commit7a6a2d65d41bed56612635fa67dda2494fe86674 (patch)
tree3f5705bfda8933827851f675bfe72339b3622685 /sys/vm
parent51304a50f3743922c7059a6d6d1eed79ced8f1c9 (diff)
downloadFreeBSD-src-7a6a2d65d41bed56612635fa67dda2494fe86674.zip
FreeBSD-src-7a6a2d65d41bed56612635fa67dda2494fe86674.tar.gz
Make uma_mtx MTX_RECURSE. Here's why:
The general UMA lock is a recursion-allowed lock because there is a code path where, while we're still configured to use startup_alloc() for backend page allocations, we may end up in uma_reclaim() which calls zone_foreach(zone_drain), which grabs uma_mtx, only to later call into startup_alloc() because while freeing we needed to allocate a bucket. Since startup_alloc() also takes uma_mtx, we need to be able to recurse on it. This exact explanation also added as comment above mtx_init(). Trace showing recursion reported by: Peter Holm <peter-at-holm.cc>
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/uma_core.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/sys/vm/uma_core.c b/sys/vm/uma_core.c
index 6a4c457..d49deea 100644
--- a/sys/vm/uma_core.c
+++ b/sys/vm/uma_core.c
@@ -1393,7 +1393,17 @@ uma_startup(void *bootmem)
#ifdef UMA_DEBUG
printf("Creating uma keg headers zone and keg.\n");
#endif
- mtx_init(&uma_mtx, "UMA lock", NULL, MTX_DEF);
+ /*
+ * The general UMA lock is a recursion-allowed lock because
+ * there is a code path where, while we're still configured
+ * to use startup_alloc() for backend page allocations, we
+ * may end up in uma_reclaim() which calls zone_foreach(zone_drain),
+ * which grabs uma_mtx, only to later call into startup_alloc()
+ * because while freeing we needed to allocate a bucket. Since
+ * startup_alloc() also takes uma_mtx, we need to be able to
+ * recurse on it.
+ */
+ mtx_init(&uma_mtx, "UMA lock", NULL, MTX_DEF | MTX_RECURSE);
/* "manually" create the initial zone */
args.name = "UMA Kegs";
OpenPOWER on IntegriCloud