]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
io_uring: fix poll full SQ detection
authorStefan Bühler <source@stbuehler.de>
Fri, 19 Apr 2019 09:57:46 +0000 (11:57 +0200)
committerJens Axboe <axboe@kernel.dk>
Mon, 22 Apr 2019 17:00:58 +0000 (11:00 -0600)
io_uring_poll shouldn't signal EPOLLOUT | EPOLLWRNORM if the queue is
full; the old check would always signal EPOLLOUT | EPOLLWRNORM (unless
there were U32_MAX - 1 entries in the SQ queue).

Signed-off-by: Stefan Bühler <source@stbuehler.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c

index 69910fd9ccca03840fa155f8f1f3c855457866fd..b998e98acd01e01a214b4e182879383b194ce74c 100644 (file)
@@ -2576,7 +2576,8 @@ static __poll_t io_uring_poll(struct file *file, poll_table *wait)
        poll_wait(file, &ctx->cq_wait, wait);
        /* See comment at the top of this file */
        smp_rmb();
-       if (READ_ONCE(ctx->sq_ring->r.tail) + 1 != ctx->cached_sq_head)
+       if (READ_ONCE(ctx->sq_ring->r.tail) - ctx->cached_sq_head !=
+           ctx->sq_ring->ring_entries)
                mask |= EPOLLOUT | EPOLLWRNORM;
        if (READ_ONCE(ctx->cq_ring->r.head) != ctx->cached_cq_tail)
                mask |= EPOLLIN | EPOLLRDNORM;