Index: libcfa/src/concurrency/io.cfa
===================================================================
--- libcfa/src/concurrency/io.cfa	(revision 1c49dc5ffbc5dbacc38e4e02c0b193eea38d80a0)
+++ libcfa/src/concurrency/io.cfa	(revision 1d5e47115e38bbee1bdc1642bf5ac53dc15d0ddc)
@@ -429,9 +429,11 @@
 // I/O Polling
 //=============================================================================================
+	static unsigned __collect_submitions( struct __io_data & ring );
+
 	// Process a single completion message from the io_uring
 	// This is NOT thread-safe
-	static unsigned __collect_submitions( struct __io_data & ring );
 	static [int, bool] __drain_io( & struct __io_data ring, * sigset_t mask, int waitcnt, bool in_kernel ) {
 		/* paranoid */ verify( !kernelTLS.preemption_state.enabled );
+		const uint32_t smask = *ring.submit_q.mask;
 
 		unsigned to_submit = 0;
@@ -441,31 +443,35 @@
 		}
 
-		const uint32_t smask = *ring.submit_q.mask;
-		uint32_t shead = *ring.submit_q.head;
-		int ret = syscall( __NR_io_uring_enter, ring.fd, to_submit, waitcnt, IORING_ENTER_GETEVENTS, mask, _NSIG / 8);
-		if( ret < 0 ) {
-			switch((int)errno) {
-			case EAGAIN:
-			case EINTR:
-				return [0, true];
-			default:
-				abort( "KERNEL ERROR: IO_URING WAIT - %s\n", strerror(errno) );
-			}
-		}
-
-		// Release the consumed SQEs
-		for( i; ret ) {
-			uint32_t idx = ring.submit_q.array[ (i + shead) & smask ];
-			ring.submit_q.sqes[ idx ].user_data = 0;
-		}
-
-		// update statistics
-		__STATS__( true,
-			if( to_submit > 0 ) {
-				io.submit_q.submit_avg.rdy += to_submit;
-				io.submit_q.submit_avg.csm += ret;
-				io.submit_q.submit_avg.cnt += 1;
-			}
-		)
+		if (to_submit > 0 || waitcnt > 0) {
+			uint32_t shead = *ring.submit_q.head;
+			int ret = syscall( __NR_io_uring_enter, ring.fd, to_submit, waitcnt, IORING_ENTER_GETEVENTS, mask, _NSIG / 8);
+			if( ret < 0 ) {
+				switch((int)errno) {
+				case EAGAIN:
+				case EINTR:
+					return [0, true];
+				default:
+					abort( "KERNEL ERROR: IO_URING WAIT - %s\n", strerror(errno) );
+				}
+			}
+
+			// Release the consumed SQEs
+			for( i; ret ) {
+				uint32_t idx = ring.submit_q.array[ (i + shead) & smask ];
+				ring.submit_q.sqes[ idx ].user_data = 0;
+			}
+
+			// update statistics
+			__STATS__( true,
+				if( to_submit > 0 ) {
+					io.submit_q.submit_avg.rdy += to_submit;
+					io.submit_q.submit_avg.csm += ret;
+					io.submit_q.submit_avg.cnt += 1;
+				}
+			)
+		}
+
+		// Memory barrier
+		__atomic_thread_fence( __ATOMIC_SEQ_CST );
 
 		// Drain the queue
@@ -474,7 +480,4 @@
 		const uint32_t mask = *ring.completion_q.mask;
 
-		// Memory barrier
-		__atomic_thread_fence( __ATOMIC_SEQ_CST );
-
 		// Nothing was new return 0
 		if (head == tail) {
@@ -483,4 +486,5 @@
 
 		uint32_t count = tail - head;
+		/* paranoid */ verify( count != 0 );
 		for(i; count) {
 			unsigned idx = (head + i) & mask;
@@ -790,5 +794,4 @@
 			// We got the lock
 			unsigned to_submit = __collect_submitions( ring );
-			const uint32_t smask = *ring.submit_q.mask;
 			uint32_t shead = *ring.submit_q.head;
 			int ret = syscall( __NR_io_uring_enter, ring.fd, to_submit, 0, 0, 0p, _NSIG / 8);
@@ -807,4 +810,5 @@
 
 			// Release the consumed SQEs
+			const uint32_t smask = *ring.submit_q.mask;
 			for( i; ret ) {
 				uint32_t idx = ring.submit_q.array[ (i + shead) & smask ];
