diff --git a/trx/trx0roll.c b/trx/trx0roll.c
index 2cf5ecf62e4ae277dbad736e2967e8f453c271be..dd7bd7cdc28127b58d17f6ece9305185b5907302 100644
--- a/trx/trx0roll.c
+++ b/trx/trx0roll.c
@@ -536,7 +536,12 @@ trx_rollback_or_clean_all_recovered(
 	} else {
 		goto leave_function;
 	}
+
+	mutex_exit(&kernel_mutex);
+
 loop:
+	mutex_enter(&kernel_mutex);
+
 	for (trx = UT_LIST_GET_FIRST(trx_sys->trx_list); trx;
 	     trx = UT_LIST_GET_NEXT(trx_list, trx)) {
 		if (!trx->is_recovered) {