io_uring: remove dependency on ring->sq/cq_entries
authorPavel Begunkov <asml.silence@gmail.com>
Sun, 16 May 2021 21:58:08 +0000 (22:58 +0100)
committerJens Axboe <axboe@kernel.dk>
Mon, 14 Jun 2021 14:23:05 +0000 (08:23 -0600)
We have numbers of {sq,cq} entries cached in ctx, don't look up them in
user-shared rings as 1) it may fetch additional cacheline 2) user may
change it and so it's always error prone.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/745d31bc2da41283ddd0489ef784af5c8d6310e9.1621201931.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c

index f628af3..169e951 100644 (file)
@@ -1356,7 +1356,7 @@ static inline bool io_sqring_full(struct io_ring_ctx *ctx)
 {
        struct io_rings *r = ctx->rings;
 
-       return READ_ONCE(r->sq.tail) - ctx->cached_sq_head == r->sq_ring_entries;
+       return READ_ONCE(r->sq.tail) - ctx->cached_sq_head == ctx->sq_entries;
 }
 
 static inline unsigned int __io_cqring_events(struct io_ring_ctx *ctx)
@@ -1374,7 +1374,7 @@ static inline struct io_uring_cqe *io_get_cqring(struct io_ring_ctx *ctx)
         * control dependency is enough as we're using WRITE_ONCE to
         * fill the cq entry
         */
-       if (__io_cqring_events(ctx) == rings->cq_ring_entries)
+       if (__io_cqring_events(ctx) == ctx->cq_entries)
                return NULL;
 
        tail = ctx->cached_cq_tail++;
@@ -1427,11 +1427,10 @@ static void io_cqring_ev_posted_iopoll(struct io_ring_ctx *ctx)
 /* Returns true if there are no backlogged entries after the flush */
 static bool __io_cqring_overflow_flush(struct io_ring_ctx *ctx, bool force)
 {
-       struct io_rings *rings = ctx->rings;
        unsigned long flags;
        bool all_flushed, posted;
 
-       if (!force && __io_cqring_events(ctx) == rings->cq_ring_entries)
+       if (!force && __io_cqring_events(ctx) == ctx->cq_entries)
                return false;
 
        posted = false;