summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2019-05-21 10:45:16 -0600
committerJens Axboe <axboe@kernel.dk>2019-05-21 10:47:32 -0600
commit829f6a9a93f99231cf1cda088816cce013ec393c (patch)
tree279ca85d251172bbe64c7189ab4f47a0014dd0e3
parentffe3e090cd41d0977ca74fafcb452838f76ceea1 (diff)
io_uring_submit: fix head/tail wrap issue
Use proper unsigned math to figure out how many entries we have. If we have head and tail on either side of UINT_MAX, then we currently don't submit anything as: while (head < tail) { is never true. Reported-by: Weiping Zhang <zhangweiping@didiglobal.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r--src/queue.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/queue.c b/src/queue.c
index 4b4fea9..5bbb279 100644
--- a/src/queue.c
+++ b/src/queue.c
@@ -71,7 +71,7 @@ int io_uring_submit(struct io_uring *ring)
{
struct io_uring_sq *sq = &ring->sq;
const unsigned mask = *sq->kring_mask;
- unsigned ktail, ktail_next, submitted;
+ unsigned ktail, ktail_next, submitted, to_submit;
int ret;
/*
@@ -93,7 +93,8 @@ int io_uring_submit(struct io_uring *ring)
*/
submitted = 0;
ktail = ktail_next = *sq->ktail;
- while (sq->sqe_head < sq->sqe_tail) {
+ to_submit = sq->sqe_tail - sq->sqe_head;
+ while (to_submit--) {
ktail_next++;
read_barrier();