slab: remove magazines from lists in depot_destroy() This never worked - if there were any magazines, we'd keep on looping until we crashed. It'd be nice if there was a BSD SLIST_POP_FIRST() or something. Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
diff --git a/kern/src/slab.c b/kern/src/slab.c index 86411fb..fecffcd 100644 --- a/kern/src/slab.c +++ b/kern/src/slab.c
@@ -414,11 +414,15 @@ lock_depot(depot); while ((mag_i = SLIST_FIRST(&depot->not_empty))) { + SLIST_REMOVE_HEAD(&depot->not_empty, link); drain_mag(kc, mag_i); kmem_cache_free(kmem_magazine_cache, mag_i); } - while ((mag_i = SLIST_FIRST(&depot->empty))) + while ((mag_i = SLIST_FIRST(&depot->empty))) { + SLIST_REMOVE_HEAD(&depot->empty, link); + assert(mag_i->nr_rounds == 0); kmem_cache_free(kmem_magazine_cache, mag_i); + } unlock_depot(depot); }