Index: kernel/generic/src/lib/ra.c
===================================================================
--- kernel/generic/src/lib/ra.c	(revision 82cbf8c6161e2ff15d39a43b59096447a98acc21)
+++ kernel/generic/src/lib/ra.c	(revision 04ba11055f3c5e7ffc8b2c766192632e2731b66f)
@@ -75,5 +75,5 @@
 static bool used_key_equal(void *key, const ht_link_t *item)
 {
-	uintptr_t *base = (sysarg_t *) key;
+	uintptr_t *base = (uintptr_t *) key;
 	ra_segment_t *seg = hash_table_get_inst(item, ra_segment_t, uh_link);
 	return seg->base == *base;
@@ -184,4 +184,20 @@
 }
 
+static void ra_span_destroy(ra_span_t *span)
+{
+	hash_table_destroy(&span->used);
+
+	list_foreach_safe(span->segments, cur, next) {
+		ra_segment_t *seg = list_get_instance(cur, ra_segment_t,
+		    segment_link);
+		list_remove(&seg->segment_link);
+		if (seg->flags & RA_SEGMENT_FREE)
+			list_remove(&seg->fl_link);
+		ra_segment_destroy(seg);
+	}
+
+	free(span);
+}
+
 /** Create an empty arena. */
 ra_arena_t *ra_arena_create(void)
@@ -197,4 +213,19 @@
 
 	return arena;
+}
+
+void ra_arena_destroy(ra_arena_t *arena)
+{
+	/*
+	 * No locking necessary as this is the cleanup and all users should have
+	 * stopped using the arena already.
+	 */
+	list_foreach_safe(arena->spans, cur, next) {
+		ra_span_t *span = list_get_instance(cur, ra_span_t, span_link);
+		list_remove(&span->span_link);
+		ra_span_destroy(span);
+	}
+
+	free(arena);
 }
 
