Index: libcfa/src/concurrency/io.cfa
===================================================================
--- libcfa/src/concurrency/io.cfa	(revision 34b6188221de19c375b4d52ee3cdd3d84f96d558)
+++ libcfa/src/concurrency/io.cfa	(revision 2fc94ced22239a3f0232704de37f737755141648)
@@ -130,4 +130,5 @@
 
 		__spinlock_t lock;
+		__spinlock_t release_lock;
 
 		// A buffer of sqes (not the actual ring)
@@ -270,4 +271,5 @@
 
 		(sq.lock){};
+		(sq.release_lock){};
 
 		if( io_flags & ( CFA_CLUSTER_IO_POLLER_THREAD_SUBMITS | CFA_CLUSTER_IO_EAGER_SUBMITS ) ) {
@@ -836,4 +838,6 @@
 			__atomic_fetch_add(tail, 1ul32, __ATOMIC_SEQ_CST);
 
+			/* paranoid */ verify( ring.submit_q.sqes[ idx ].user_data != 0 );
+
 			// Submit however, many entries need to be submitted
 			int ret = syscall( __NR_io_uring_enter, ring.fd, 1, 0, 0, 0p, 0);
@@ -889,7 +893,11 @@
 	static uint32_t __release_consumed_submission( struct __io_data & ring ) {
 		const uint32_t smask = *ring.submit_q.mask;
+
+		if( !try_lock(ring.submit_q.release_lock __cfaabi_dbg_ctx2) ) return 0;
 		uint32_t chead = *ring.submit_q.head;
 		uint32_t phead = ring.submit_q.prev_head;
 		ring.submit_q.prev_head = chead;
+		unlock(ring.submit_q.release_lock);
+
 		uint32_t count = chead - phead;
 		for( i; count ) {
