Index: kernel/generic/src/main/main.c
===================================================================
--- kernel/generic/src/main/main.c	(revision 0496c1788f5c44ab96b952f38fcc57fc253e00b7)
+++ kernel/generic/src/main/main.c	(revision 0d8a304c1941d4b637abf937d8947384c88d0e1c)
@@ -71,4 +71,5 @@
 #include <mm/as.h>
 #include <mm/slab.h>
+#include <mm/reserve.h>
 #include <synch/waitq.h>
 #include <synch/futex.h>
@@ -217,4 +218,5 @@
 	ddi_init();
 	arch_post_mm_init();
+	reserve_init();
 	arch_pre_smp_init();
 	smp_init();
Index: kernel/generic/src/mm/frame.c
===================================================================
--- kernel/generic/src/mm/frame.c	(revision 0496c1788f5c44ab96b952f38fcc57fc253e00b7)
+++ kernel/generic/src/mm/frame.c	(revision 0d8a304c1941d4b637abf937d8947384c88d0e1c)
@@ -182,9 +182,9 @@
  *
  */
-#ifdef CONFIG_DEBUG
-NO_TRACE static size_t total_frames_free(void)
+NO_TRACE static size_t frame_total_free_get_internal(void)
 {
 	size_t total = 0;
 	size_t i;
+
 	for (i = 0; i < zones.count; i++)
 		total += zones.info[i].free_count;
@@ -192,5 +192,16 @@
 	return total;
 }
-#endif /* CONFIG_DEBUG */
+
+NO_TRACE size_t frame_total_free_get(void)
+{
+	size_t total;
+
+	irq_spinlock_lock(&zones.lock, true);
+	total = frame_total_free_get_internal();
+	irq_spinlock_unlock(&zones.lock, true);
+
+	return total;
+}
+
 
 /** Find a zone with a given frames.
@@ -840,7 +851,4 @@
 			buddy_system_free(zone->buddy_system, &zone->frames[i].buddy_link);
 		}
-
-		/* "Unreserve" new frames. */
-		reserve_free(count);
 	} else
 		zone->frames = NULL;
@@ -1051,5 +1059,5 @@
 		
 #ifdef CONFIG_DEBUG
-		size_t avail = total_frames_free();
+		size_t avail = frame_total_free_get_internal();
 #endif
 		
Index: kernel/generic/src/mm/reserve.c
===================================================================
--- kernel/generic/src/mm/reserve.c	(revision 0496c1788f5c44ab96b952f38fcc57fc253e00b7)
+++ kernel/generic/src/mm/reserve.c	(revision 0d8a304c1941d4b637abf937d8947384c88d0e1c)
@@ -45,4 +45,14 @@
 IRQ_SPINLOCK_STATIC_INITIALIZE_NAME(reserve_lock, "reserve_lock");
 static ssize_t reserve = 0;
+
+/** Initialize memory reservations tracking.
+ *
+ * This function must be called after frame zones are created and merged
+ * and before any address space area is created.
+ */
+void reserve_init(void)
+{
+	reserve = frame_total_free_get();
+}
 
 /** Try to reserve memory.
