If you have used an event loop, you have probably written some variation of this: Wait for a socket to become readable. Read from it. Process the bytes. Go back to waiting. A completion-based I/O interface moves some of that work across the application/kernel boundary. Instead of asking which sockets might be ready, the application can describe the reads it wants and collect their results later. kqring is an experimental FreeBSD kernel module that exposes an io_uring-oriented ...