Index: kernel/generic/src/mm/frame.c
===================================================================
--- kernel/generic/src/mm/frame.c	(revision 597fa246c9481b40ae4d512256c4ceea4506b215)
+++ kernel/generic/src/mm/frame.c	(revision 9daee3de8f3cc14d8464bd7f7eb8f3ccb749a1fd)
@@ -72,5 +72,5 @@
  * available.
  */
-static MUTEX_INITIALIZE(mem_avail_mtx, MUTEX_ACTIVE);
+static IRQ_SPINLOCK_INITIALIZE(mem_avail_lock);
 static CONDVAR_INITIALIZE(mem_avail_cv);
 static size_t mem_avail_req = 0;  /**< Number of frames requested. */
@@ -951,10 +951,6 @@
 #endif
 
-		/*
-		 * Since the mem_avail_mtx is an active mutex, we need to
-		 * disable interrupts to prevent deadlock with TLB shootdown.
-		 */
-		ipl_t ipl = interrupts_disable();
-		mutex_lock(&mem_avail_mtx);
+		/* Disabled interrupts needed to prevent deadlock with TLB shootdown. */
+		irq_spinlock_lock(&mem_avail_lock, true);
 
 		if (mem_avail_req > 0)
@@ -966,8 +962,7 @@
 
 		while (gen == mem_avail_gen)
-			condvar_wait(&mem_avail_cv, &mem_avail_mtx);
-
-		mutex_unlock(&mem_avail_mtx);
-		interrupts_restore(ipl);
+			condvar_wait(&mem_avail_cv, &mem_avail_lock);
+
+		irq_spinlock_unlock(&mem_avail_lock, true);
 
 #ifdef CONFIG_DEBUG
@@ -1027,13 +1022,8 @@
 	irq_spinlock_unlock(&zones.lock, true);
 
-	/*
-	 * Signal that some memory has been freed.
-	 * Since the mem_avail_mtx is an active mutex,
-	 * we need to disable interruptsto prevent deadlock
-	 * with TLB shootdown.
-	 */
-
-	ipl_t ipl = interrupts_disable();
-	mutex_lock(&mem_avail_mtx);
+	/* Signal that some memory has been freed. */
+
+	/* Disabled interrupts needed to prevent deadlock with TLB shootdown. */
+	irq_spinlock_lock(&mem_avail_lock, true);
 
 	if (mem_avail_req > 0)
@@ -1045,6 +1035,5 @@
 	}
 
-	mutex_unlock(&mem_avail_mtx);
-	interrupts_restore(ipl);
+	irq_spinlock_unlock(&mem_avail_lock, true);
 
 	if (!(flags & FRAME_NO_RESERVE))
