arena: destroy qcaches when destroying arenas Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
diff --git a/kern/src/arena.c b/kern/src/arena.c index a4f9d4e..2c90628 100644 --- a/kern/src/arena.c +++ b/kern/src/arena.c
@@ -133,6 +133,24 @@ } } +static void destroy_qcaches(struct arena *arena) +{ + int nr_qcaches = arena->qcache_max / arena->quantum; + struct kmem_cache *kc; + + if (!nr_qcaches) + return; + + for (int i = 0; i < nr_qcaches; i++) { + kc = &arena->qcaches[i]; + kmem_cache_destroy(kc); + } + + base_free(arena, arena->qcaches, + nr_qcaches * sizeof(struct kmem_cache)); + arena->qcaches = NULL; +} + static void arena_init(struct arena *arena, const char *name, size_t quantum, void *(*afunc)(struct arena *, size_t, int), void (*ffunc)(struct arena *, void *, size_t), @@ -217,7 +235,7 @@ qunlock(&arenas_and_slabs_lock); if (arena->source) del_importing_arena(arena->source, arena); - + destroy_qcaches(arena); for (int i = 0; i < arena->hh.nr_hash_lists; i++) { /* Marginal at best. The qcaches are destroyed already; if * someone tries to free this later, we're in trouble. */