Index: libcfa/src/concurrency/io.cfa
===================================================================
--- libcfa/src/concurrency/io.cfa	(revision dcb5f8d2e676f02ad3b72ecc3baceb751ea793c9)
+++ libcfa/src/concurrency/io.cfa	(revision 1095ccd2a6aeedf7408f05427dd8313a9fca5e0e)
@@ -514,4 +514,5 @@
 	}
 
+	#define PARTIAL_SUBMIT 32
 	static unsigned __collect_submitions( struct __io_data & ring ) {
 		/* paranoid */ verify( ring.submit_q.ready != 0p );
@@ -521,7 +522,20 @@
 		__u32 tail = *ring.submit_q.tail;
 		const __u32 mask = *ring.submit_q.mask;
+		#if defined(PARTIAL_SUBMIT)
+			#if defined(LEADER_LOCK)
+				#error PARTIAL_SUBMIT and LEADER_LOCK cannot co-exist
+			#endif
+			const __u32 cnt = ring.submit_q.ready_cnt > PARTIAL_SUBMIT ? PARTIAL_SUBMIT : ring.submit_q.ready_cnt;
+			const __u32 offset = ring.submit_q.prev_ready;
+			ring.submit_q.prev_ready += cnt;
+		#else
+			const __u32 cnt = ring.submit_q.ready_cnt;
+			const __u32 offset = 0;
+		#endif
 
 		// Go through the list of ready submissions
-		for( i; ring.submit_q.ready_cnt ) {
+		for( c; cnt ) {
+			__u32 i = (offset + c) % ring.submit_q.ready_cnt;
+
 			// replace any submission with the sentinel, to consume it.
 			__u32 idx = __atomic_exchange_n( &ring.submit_q.ready[i], -1ul32, __ATOMIC_RELAXED);
Index: libcfa/src/concurrency/io/setup.cfa
===================================================================
--- libcfa/src/concurrency/io/setup.cfa	(revision dcb5f8d2e676f02ad3b72ecc3baceb751ea793c9)
+++ libcfa/src/concurrency/io/setup.cfa	(revision 1095ccd2a6aeedf7408f05427dd8313a9fca5e0e)
@@ -388,8 +388,10 @@
 				sq.ready[i] = -1ul32;
 			}
+			sq.prev_ready = 0;
 		}
 		else {
 			sq.ready_cnt = 0;
 			sq.ready = 0p;
+			sq.prev_ready = 0;
 		}
 
Index: libcfa/src/concurrency/io/types.hfa
===================================================================
--- libcfa/src/concurrency/io/types.hfa	(revision dcb5f8d2e676f02ad3b72ecc3baceb751ea793c9)
+++ libcfa/src/concurrency/io/types.hfa	(revision 1095ccd2a6aeedf7408f05427dd8313a9fca5e0e)
@@ -23,5 +23,5 @@
       #include "bits/locks.hfa"
 
-	#define LEADER_LOCK
+	// #define LEADER_LOCK
 	struct __leaderlock_t {
 		struct $thread * volatile value;	// ($thread) next_leader | (bool:1) is_locked
@@ -55,4 +55,5 @@
 		volatile __u32 * ready;
 		__u32 ready_cnt;
+		__u32 prev_ready;
 
 		#if defined(LEADER_LOCK)
