Description
This is more of a discussion than an actual issue at the moment, but I hope to provide more concrete details as we explore the use cases.
We have an interesting problem regarding IORING_OP_READV
/IORING_OP_WRITEV
. In a general programming language environment, we don't always know if the file descriptor is in non-blocking mode or not.
But the behaviour of IORING_OP_READV
/IORING_OP_WRITEV
depends on it. In non-blocking mode, we can get a result of EAGAIN
.
However, this is not very useful in the case of even driven concurrency where we want operations like this to be "asynchronous" "blocking" - i.e. the CQE should not be generated until the read/write could make progress.
In general, my understanding is, we'd need 3-4 system calls to work around this, something like this:
int current_state = get_nonblocking_state(fd);
if (current_state != nonblocking) set_nonblocking_state(fd);
io_uring_read(..., fd, ...)
if (nonblocking_state_was_changed) restore_nonblocking_state(fd, current_state);
We can cache this to reduce the round trips, but it feels like this would be something better solved by a flag on IORING_OP_READV
/IORING_OP_WRITEV
. In fact, I'm having a hard time imagining any valid use case for non-blocking operation in the uring.
I'll try to test out specific cases where this is a problem and report back.