Index: uspace/lib/c/generic/fibril.c
===================================================================
--- uspace/lib/c/generic/fibril.c	(revision 808026296d66a63b501dc0af9d457077cd81e32b)
+++ uspace/lib/c/generic/fibril.c	(revision 2965d181ff4a61d9c12722159b0950b6d2c4e87a)
@@ -476,4 +476,6 @@
 static void _fibril_switch_to(_switch_type_t type, fibril_t *dstf, bool locked)
 {
+	assert(fibril_self()->rmutex_locks == 0);
+
 	if (!locked)
 		futex_lock(&fibril_futex);
@@ -633,4 +635,6 @@
 errno_t fibril_wait_timeout(fibril_event_t *event, const struct timeval *expires)
 {
+	assert(fibril_self()->rmutex_locks == 0);
+
 	DPRINTF("### Fibril %p sleeping on event %p.\n", fibril_self(), event);
 
@@ -713,4 +717,6 @@
 void fibril_wait_for(fibril_event_t *event)
 {
+	assert(fibril_self()->rmutex_locks == 0);
+
 	(void) fibril_wait_timeout(event, NULL);
 }
@@ -769,4 +775,7 @@
 void fibril_yield(void)
 {
+	if (fibril_self()->rmutex_locks > 0)
+		return;
+
 	fibril_t *f = _ready_list_pop_nonblocking(false);
 	if (f)
@@ -789,4 +798,6 @@
 int fibril_test_spawn_runners(int n)
 {
+	assert(fibril_self()->rmutex_locks == 0);
+
 	if (!multithreaded) {
 		_ready_debug_check();
Index: uspace/lib/c/generic/fibril_synch.c
===================================================================
--- uspace/lib/c/generic/fibril_synch.c	(revision 808026296d66a63b501dc0af9d457077cd81e32b)
+++ uspace/lib/c/generic/fibril_synch.c	(revision 2965d181ff4a61d9c12722159b0950b6d2c4e87a)
@@ -50,4 +50,36 @@
 #include "private/async.h"
 #include "private/fibril.h"
+
+void fibril_rmutex_initialize(fibril_rmutex_t *m)
+{
+	futex_initialize(&m->futex, 1);
+}
+
+/**
+ * Lock restricted mutex.
+ * When a restricted mutex is locked, the fibril may not sleep or create new
+ * threads. Any attempt to do so will abort the program.
+ */
+void fibril_rmutex_lock(fibril_rmutex_t *m)
+{
+	futex_lock(&m->futex);
+	fibril_self()->rmutex_locks++;
+}
+
+bool fibril_rmutex_trylock(fibril_rmutex_t *m)
+{
+	if (futex_trylock(&m->futex)) {
+		fibril_self()->rmutex_locks++;
+		return true;
+	} else {
+		return false;
+	}
+}
+
+void fibril_rmutex_unlock(fibril_rmutex_t *m)
+{
+	fibril_self()->rmutex_locks--;
+	futex_unlock(&m->futex);
+}
 
 static fibril_local bool deadlocked = false;
Index: uspace/lib/c/generic/futex.c
===================================================================
--- uspace/lib/c/generic/futex.c	(revision 808026296d66a63b501dc0af9d457077cd81e32b)
+++ uspace/lib/c/generic/futex.c	(revision 2965d181ff4a61d9c12722159b0950b6d2c4e87a)
@@ -43,5 +43,5 @@
 
 //#define DPRINTF(...) kio_printf(__VA_ARGS__)
-#define DPRINTF(...) ((void)0)
+#define DPRINTF(...) dummy_printf(__VA_ARGS__)
 
 /** Initialize futex counter.
@@ -84,4 +84,5 @@
 	 * They should compile to regular load/stores, but simple assignments
 	 * would be UB by definition.
+	 * The proper ordering is ensured by the surrounding futex operation.
 	 */
 
@@ -94,6 +95,4 @@
 	assert(prev_owner == NULL);
 	__atomic_store_n(&futex->owner, self, __ATOMIC_RELAXED);
-
-	atomic_inc(&self->futex_locks);
 }
 
@@ -104,5 +103,4 @@
 	__futex_assert_is_locked(futex, name);
 	__atomic_store_n(&futex->owner, NULL, __ATOMIC_RELAXED);
-	atomic_dec(&self->futex_locks);
 	futex_up(futex);
 }
@@ -117,6 +115,4 @@
 
 		__atomic_store_n(&futex->owner, self, __ATOMIC_RELAXED);
-
-		atomic_inc(&self->futex_locks);
 
 		DPRINTF("Trylock on futex %s (%p) by fibril %p succeeded.\n", name, futex, self);
@@ -135,6 +131,4 @@
 
 	__futex_assert_is_locked(futex, name);
-	atomic_dec(&self->futex_locks);
-	atomic_inc(&no->futex_locks);
 	__atomic_store_n(&futex->owner, new_owner, __ATOMIC_RELAXED);
 }
Index: uspace/lib/c/generic/private/fibril.h
===================================================================
--- uspace/lib/c/generic/private/fibril.h	(revision 808026296d66a63b501dc0af9d457077cd81e32b)
+++ uspace/lib/c/generic/private/fibril.h	(revision 2965d181ff4a61d9c12722159b0950b6d2c4e87a)
@@ -61,5 +61,5 @@
 
 	/* Debugging stuff. */
-	atomic_t futex_locks;
+	int rmutex_locks;
 	fibril_owner_info_t *waits_for;
 	fibril_event_t *sleep_event;
Index: uspace/lib/c/include/fibril_synch.h
===================================================================
--- uspace/lib/c/include/fibril_synch.h	(revision 808026296d66a63b501dc0af9d457077cd81e32b)
+++ uspace/lib/c/include/fibril_synch.h	(revision 2965d181ff4a61d9c12722159b0950b6d2c4e87a)
@@ -80,24 +80,4 @@
 #define FIBRIL_RMUTEX_INITIALIZE(name) \
 	fibril_rmutex_t name = FIBRIL_RMUTEX_INITIALIZER(name)
-
-static inline void fibril_rmutex_initialize(fibril_rmutex_t *m)
-{
-	futex_initialize(&m->futex, 1);
-}
-
-static inline void fibril_rmutex_lock(fibril_rmutex_t *m)
-{
-	futex_lock(&m->futex);
-}
-
-static inline bool fibril_rmutex_trylock(fibril_rmutex_t *m)
-{
-	return futex_trylock(&m->futex);
-}
-
-static inline void fibril_rmutex_unlock(fibril_rmutex_t *m)
-{
-	futex_unlock(&m->futex);
-}
 
 typedef struct {
@@ -222,4 +202,9 @@
 	fibril_semaphore_t name = FIBRIL_SEMAPHORE_INITIALIZER(name, cnt)
 
+extern void fibril_rmutex_initialize(fibril_rmutex_t *);
+extern void fibril_rmutex_lock(fibril_rmutex_t *);
+extern bool fibril_rmutex_trylock(fibril_rmutex_t *);
+extern void fibril_rmutex_unlock(fibril_rmutex_t *);
+
 extern void fibril_mutex_initialize(fibril_mutex_t *);
 extern void fibril_mutex_lock(fibril_mutex_t *);
Index: uspace/lib/c/include/io/kio.h
===================================================================
--- uspace/lib/c/include/io/kio.h	(revision 808026296d66a63b501dc0af9d457077cd81e32b)
+++ uspace/lib/c/include/io/kio.h	(revision 2965d181ff4a61d9c12722159b0950b6d2c4e87a)
@@ -49,4 +49,18 @@
 extern int kio_vprintf(const char *, va_list);
 
+/*
+ * In some files, we have conditional DPRINTF(...) macro that is defined empty
+ * in most cases. Provide a dummy printf so we get argument checking and
+ * avoid unused variable errors.
+ */
+
+static inline int dummy_printf(const char *fmt, ...) _HELENOS_PRINTF_ATTRIBUTE(1, 2);
+static inline int dummy_printf(const char *fmt, ...)
+{
+	/* Empty. */
+	(void) fmt;
+	return 0;
+}
+
 #endif
 
