Index: kernel/generic/include/lib/ra.h
===================================================================
--- kernel/generic/include/lib/ra.h	(revision ca207e039a3c4881e7ab829333a6c310abb4962c)
+++ kernel/generic/include/lib/ra.h	(revision e02bfb4052ff7a7cb31419189b21eb24ab42bc90)
@@ -87,4 +87,5 @@
 extern void ra_init(void);
 extern ra_arena_t *ra_arena_create(void);
+extern void ra_arena_destroy(ra_arena_t *);
 extern bool ra_span_add(ra_arena_t *, uintptr_t, size_t);
 extern bool ra_alloc(ra_arena_t *, size_t, size_t, uintptr_t *);
Index: kernel/generic/src/lib/ra.c
===================================================================
--- kernel/generic/src/lib/ra.c	(revision ca207e039a3c4881e7ab829333a6c310abb4962c)
+++ kernel/generic/src/lib/ra.c	(revision e02bfb4052ff7a7cb31419189b21eb24ab42bc90)
@@ -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);
 }
 
