arena: check for imports when destroying
This catches bugs where we tear down an arena while other arenas or
slabs still depend on it. It's the equivalent of a use-after-free.
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
diff --git a/kern/src/arena.c b/kern/src/arena.c
index 6f6e400..c23ac41 100644
--- a/kern/src/arena.c
+++ b/kern/src/arena.c
@@ -274,11 +274,32 @@
return arena;
}
+static bool __has_importer(struct arena *arena)
+{
+ struct arena *a_i;
+ struct kmem_cache *kc_i;
+
+ TAILQ_FOREACH(a_i, &arena->__importing_arenas, import_link) {
+ if (a_i != arena)
+ return true;
+ }
+ TAILQ_FOREACH(kc_i, &arena->__importing_slabs, import_link) {
+ if (!(kc_i->flags & KMC_QCACHE))
+ return true;
+ }
+ return false;
+}
+
void arena_destroy(struct arena *arena)
{
struct btag *bt_i, *temp;
qlock(&arenas_and_slabs_lock);
+ if (__has_importer(arena)) {
+ warn("Arena %s has importers! Will not destroy.", arena->name);
+ qunlock(&arenas_and_slabs_lock);
+ return;
+ }
TAILQ_REMOVE(&all_arenas, arena, next);
qunlock(&arenas_and_slabs_lock);
if (arena->source)