-
Notifications
You must be signed in to change notification settings - Fork 521
Behavior of io_uring_submit with unprepared SQEs #1483
Answered
by
krisman
DigoqueDigo
asked this question in
Q&A
-
The man page for io_uring_queue_submit says:
After the caller retrieves a submission queue entry (SQE) with io_uring_get_sqe(3) and prepares the SQE using one of the provided helpers, it can be submitted with io_uring_submit(3).
In this code, the next available submission queue entry is retrieved until it returns null, and finally a submit is performed. Considering that no SQE was actually prepared, how is it possible that io_uring_submit returns 2? This seems to indicate that 2 SQEs were prepared, when in fact that did not happen.
Perhaps this is expected behavior, but it seems illogical to me.
struct io_uring ring; if (io_uring_queue_init(2, &ring, 0) < 0) { exit(1); } struct io_uring_sqe* sqe = io_uring_get_sqe(&ring); std::cout << sqe << std::endl; sqe = io_uring_get_sqe(&ring); std::cout << sqe << std::endl; sqe = io_uring_get_sqe(&ring); std::cout << sqe << std::endl; int submitted = io_uring_submit(&ring); std::cout << submitted << std::endl; exit(1);
$ ./foo
0x7f14e3b5f000
0x7f14e3b5f040
0
2
Beta Was this translation helpful? Give feedback.
All reactions
Answered by
krisman
Oct 20, 2025
Diogo Marques ***@***.***> writes:
The man page for [`io_uring_queue_submit`](https://man7.org/linux/man-pages/man3/io_uring_submit.3.html) says: > After the caller retrieves a submission queue entry (SQE) with
> [io_uring_get_sqe(3)](https://man7.org/linux/man-pages/man3/io_uring_get_sqe.3.html)
> and prepares the SQE using one of the provided helpers, it can be
> submitted with
> [io_uring_submit(3)](https://man7.org/linux/man-pages/man3/io_uring_submit.3.html). In this code, the next available submission queue entry is retrieved until it returns `null`, and finally a submit is performed. Considering that no SQE was actually prepared, how is it possible that `io_uring_submit` returns `...
Replies: 1 comment
-
Diogo Marques ***@***.***> writes:
The man page for [`io_uring_queue_submit`](https://man7.org/linux/man-pages/man3/io_uring_submit.3.html) says:
> After the caller retrieves a submission queue entry (SQE) with
> [io_uring_get_sqe(3)](https://man7.org/linux/man-pages/man3/io_uring_get_sqe.3.html)
> and prepares the SQE using one of the provided helpers, it can be
> submitted with
> [io_uring_submit(3)](https://man7.org/linux/man-pages/man3/io_uring_submit.3.html).
In this code, the next available submission queue entry is retrieved
until it returns `null`, and finally a submit is performed. Considering
that no SQE was actually prepared, how is it possible that
`io_uring_submit` returns `2`? This seems to indicate that 2 SQEs were
prepared, when in fact that did not happen.
Perhaps this is expected behavior, but it seems illogical to me.
It is expected behavior. io_urig_get_sqe gives you an SQE to fill, and
advances the userspace tail, indicating this sqe is "pending
submission". You are supposed to fill this sqe *before* calling
io_uring_submit. If you don't, io_uring will gladly submit everything
that is pending and you'll get an error CQE when it is processed,
indicating you submitted an invalid request.
io_uring_submit is basically telling the kernel you are done preparing
the SQEs and the kernel can try to execute them. You are required to
prepare them before calling io_uring_submit. It returns the number of
SQEs that were submitted to the kernel, not what was already executed.
... ```c
struct io_uring ring;
if (io_uring_queue_init(2, &ring, 0) < 0) {
exit(1);
}
struct io_uring_sqe* sqe = io_uring_get_sqe(&ring);
std::cout << sqe << std::endl;
sqe = io_uring_get_sqe(&ring);
std::cout << sqe << std::endl;
sqe = io_uring_get_sqe(&ring);
std::cout << sqe << std::endl;
int submitted = io_uring_submit(&ring);
std::cout << submitted << std::endl;
exit(1);
```
```
$ ./foo
0x7f14e3b5f000
0x7f14e3b5f040
0
2
--
Gabriel Krisman Bertazi
Beta Was this translation helpful? Give feedback.
All reactions
0 replies
Answer selected by
DigoqueDigo
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment