diff options
author | bmilekic <bmilekic@FreeBSD.org> | 2004-06-23 21:59:03 +0000 |
---|---|---|
committer | bmilekic <bmilekic@FreeBSD.org> | 2004-06-23 21:59:03 +0000 |
commit | 7a6a2d65d41bed56612635fa67dda2494fe86674 (patch) | |
tree | 3f5705bfda8933827851f675bfe72339b3622685 /sys/vm | |
parent | 51304a50f3743922c7059a6d6d1eed79ced8f1c9 (diff) | |
download | FreeBSD-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.c | 12 |
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"; |