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. */