Index: libcfa/src/concurrency/io.cfa
===================================================================
--- libcfa/src/concurrency/io.cfa	(revision 3bb4f85c9fb4c5cb977c217840ff865f8f858995)
+++ libcfa/src/concurrency/io.cfa	(revision d3605f8b23383df7dd28db382d22350cf8eb7e71)
@@ -33,4 +33,5 @@
 		#include <sys/syscall.h>
 		#include <sys/eventfd.h>
+		#include <sys/uio.h>
 
 		#include <linux/io_uring.h>
@@ -502,6 +503,6 @@
 	}
 
-	#if defined(IO_URING_IDLE)
-		bool __kernel_read(processor * proc, io_future_t & future, char buf[], int fd) {
+	#if defined(CFA_WITH_IO_URING_IDLE)
+		bool __kernel_read(processor * proc, io_future_t & future, iovec & iov, int fd) {
 			$io_context * ctx = proc->io.ctx;
 			/* paranoid */ verify( ! __preemption_enabled() );
@@ -518,16 +519,25 @@
 			__fill( &sqe, 1, &idx, ctx );
 
-			sqe->opcode = IORING_OP_READ;
 			sqe->user_data = (uintptr_t)&future;
 			sqe->flags = 0;
-			sqe->ioprio = 0;
 			sqe->fd = fd;
 			sqe->off = 0;
+			sqe->ioprio = 0;
 			sqe->fsync_flags = 0;
 			sqe->__pad2[0] = 0;
 			sqe->__pad2[1] = 0;
 			sqe->__pad2[2] = 0;
-			sqe->addr = (uintptr_t)buf;
-			sqe->len = sizeof(uint64_t);
+
+			#if defined(CFA_HAVE_IORING_OP_READ)
+				sqe->opcode = IORING_OP_READ;
+				sqe->addr = (uint64_t)iov.iov_base;
+				sqe->len = iov.iov_len;
+			#elif defined(CFA_HAVE_READV) && defined(CFA_HAVE_IORING_OP_READV)
+				sqe->opcode = IORING_OP_READV;
+				sqe->addr = (uintptr_t)&iov;
+				sqe->len = 1;
+			#else
+				#error CFA_WITH_IO_URING_IDLE but none of CFA_HAVE_READV, CFA_HAVE_IORING_OP_READV or CFA_HAVE_IORING_OP_READ defined
+			#endif
 
 			asm volatile("": : :"memory");
Index: libcfa/src/concurrency/io/setup.cfa
===================================================================
--- libcfa/src/concurrency/io/setup.cfa	(revision 3bb4f85c9fb4c5cb977c217840ff865f8f858995)
+++ libcfa/src/concurrency/io/setup.cfa	(revision d3605f8b23383df7dd28db382d22350cf8eb7e71)
@@ -220,5 +220,5 @@
 		cq.cqes = (struct io_uring_cqe *)(((intptr_t)cq.ring_ptr) + params.cq_off.cqes);
 
-		#if !defined(IO_URING_IDLE)
+		#if !defined(CFA_WITH_IO_URING_IDLE)
 			// Step 4 : eventfd
 			// io_uring_register is so f*cking slow on some machine that it
Index: libcfa/src/concurrency/kernel.cfa
===================================================================
--- libcfa/src/concurrency/kernel.cfa	(revision 3bb4f85c9fb4c5cb977c217840ff865f8f858995)
+++ libcfa/src/concurrency/kernel.cfa	(revision d3605f8b23383df7dd28db382d22350cf8eb7e71)
@@ -27,4 +27,5 @@
 extern "C" {
 	#include <sys/eventfd.h>
+	#include <sys/uio.h>
 }
 
@@ -125,5 +126,5 @@
 static void __wake_one(cluster * cltr);
 
-static void idle_sleep(processor * proc, io_future_t & future, eventfd_t & val);
+static void idle_sleep(processor * proc, io_future_t & future, iovec & iov);
 static bool mark_idle (__cluster_proc_list & idles, processor & proc);
 static void mark_awake(__cluster_proc_list & idles, processor & proc);
@@ -135,6 +136,6 @@
 static inline bool __maybe_io_drain( processor * );
 
-#if defined(IO_URING_IDLE) && defined(CFA_HAVE_LINUX_IO_URING_H)
-	extern bool __kernel_read(processor * proc, io_future_t & future, char buf[], int fd);
+#if defined(CFA_WITH_IO_URING_IDLE)
+	extern bool __kernel_read(processor * proc, io_future_t & future, iovec &, int fd);
 #endif
 
@@ -172,4 +173,5 @@
 	future.self.ptr = 1p;  // mark it as already fulfilled so we know if there is a pending request or not
 	eventfd_t idle_val;
+	iovec idle_iovec = { &idle_val, sizeof(idle_val) };
 
 	__cfa_io_start( this );
@@ -237,5 +239,5 @@
 				}
 
-				idle_sleep( this, future, idle_val );
+				idle_sleep( this, future, idle_iovec );
 
 				// We were woken up, remove self from idle
@@ -784,6 +786,6 @@
 }
 
-static void idle_sleep(processor * this, io_future_t & future, eventfd_t & val) {
-	#if !defined(IO_URING_IDLE) || !defined(CFA_HAVE_LINUX_IO_URING_H)
+static void idle_sleep(processor * this, io_future_t & future, iovec & iov) {
+	#if !defined(CFA_WITH_IO_URING_IDLE)
 		#if !defined(__CFA_NO_STATISTICS__)
 			if(this->print_halts) {
@@ -818,7 +820,4 @@
 		#endif
 	#else
-		#if !defined(CFA_HAVE_IORING_OP_READ)
-			#error this is only implemented if the read is present
-		#endif
 		// Do we already have a pending read
 		if(available(future)) {
@@ -826,5 +825,5 @@
 			reset(future);
 
-			__kernel_read(this, future, (char *)&val, this->idle_fd );
+			__kernel_read(this, future, iov, this->idle_fd );
 		}
 
Index: libcfa/src/concurrency/kernel_private.hfa
===================================================================
--- libcfa/src/concurrency/kernel_private.hfa	(revision 3bb4f85c9fb4c5cb977c217840ff865f8f858995)
+++ libcfa/src/concurrency/kernel_private.hfa	(revision d3605f8b23383df7dd28db382d22350cf8eb7e71)
@@ -39,5 +39,13 @@
 }
 
-// #define IO_URING_IDLE
+// Defines whether or not we *want* to use io_uring_enter as the idle_sleep blocking call
+#define CFA_WANT_IO_URING_IDLE
+
+// Defines whether or not we *can* use io_uring_enter as the idle_sleep blocking call
+#if defined(CFA_WANT_IO_URING_IDLE) && defined(CFA_HAVE_LINUX_IO_URING_H)
+	#if defined(CFA_HAVE_IORING_OP_READ) || (defined(CFA_HAVE_READV) && defined(CFA_HAVE_IORING_OP_READV))
+		#define CFA_WITH_IO_URING_IDLE
+	#endif
+#endif
 
 //-----------------------------------------------------------------------------
