Index: kernel/generic/src/mm/frame.c
===================================================================
--- kernel/generic/src/mm/frame.c	(revision 933cadfdb63d0a16870db764880b5c144894e112)
+++ kernel/generic/src/mm/frame.c	(revision a6d8726cdc2bcda6a70cff109d5ef6a3c639ccc8)
@@ -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 933cadfdb63d0a16870db764880b5c144894e112)
+++ kernel/generic/src/mm/reserve.c	(revision a6d8726cdc2bcda6a70cff109d5ef6a3c639ccc8)
@@ -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.
