Hi,
now that I've got some of my rust code running with io_uring I don't
think io_uring is ready.
If marking it as EXPERIMENTAL (and not "default y") is considered a
clear flag for "API might still change" I'd recommend going for that.
Here is my current issue list:
---
1. An error for a submission should be returned as completion for that
submission. Please don't break my main event loop with strange error
codes just because a single operation is broken/not supported/...
2. {read,write}_iter and FMODE_NOWAIT / IOCB_NOWAIT is broken at the vfs
layer: vfs_{read,write} should set IOCB_NOWAIT if O_NONBLOCK is set when
they call {read,write}_iter (i.e. init_sync_kiocb/iocb_flags needs to
convert the flag).
And all {read,write}_iter should check IOCB_NOWAIT instead of O_NONBLOCK
(hi there pipe.c!), and set FMODE_NOWAIT if they support IOCB_NOWAIT.
{read,write}_iter should only queue the IOCB though if is_sync_kiocb()
returns false (i.e. if ki_callback is set).
Because right now an IORING_OP_READV on a blocking pipe *blocks*
io_uring_enter, and on a non-blocking pipe completes with EAGAIN all the
time.
So io_uring (readv) doesn't even work on a pipe! (At least
IORING_OP_POLL_ADD is working...)
As another side note: timerfd doesn't have read_iter, so needs
IORING_OP_POLL_ADD too... :(
(Also RWF_NOWAIT doesn't work in io_uring right now: IOCB_NOWAIT is
always removed in the workqueue context, and I don't see an early EAGAIN
completion).
3. io_file_supports_async should check for FMODE_NOWAIT instead of using
some hard-coded magic checks.
4. io_prep_rw shouldn't disable force_nonblock if FMODE_NOWAIT isn't
available; it should return EAGAIN instead and let the workqueue handle it.
Because otherwise the event loop is blocking again.
---
I'm guessing especially 2. has something to do with why aio never took
off - so maybe it's time to fix the underlying issues first.
I'd be happy to contribute a few patches to those issues if there is an
agreement what the result should look like :)
I have one other question: is there any way to cancel an IO read/write
operation? I don't think closing io_uring has any effect, what about
closing the files I'm reading/writing? (Adding cancelation to kiocb
sounds like a non-trivial task; and I don't think it already supports it.)
So cleanup in general seems hard to me: do I have to wait for all
read/write operations to complete so I can safely free all buffers
before I close the event loop?
cheers,
Stefan