]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
io_uring/zcrx: improve rqe cache alignment
authorPavel Begunkov <asml.silence@gmail.com>
Tue, 16 Sep 2025 14:27:44 +0000 (15:27 +0100)
committerJens Axboe <axboe@kernel.dk>
Tue, 16 Sep 2025 18:37:20 +0000 (12:37 -0600)
Refill queue entries are 16B structures, but because of the ring header
placement, they're 8B aligned but not naturally / 16B aligned, which
means some of them span across 2 cache lines. Push rqes to a new cache
line.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/zcrx.c

index 51fd2350dbe91d3221d93fbf7617be1589ccd0af..c02045e4c1b65f2700bcfb2be26f935eef6bbca4 100644 (file)
@@ -352,7 +352,7 @@ static int io_allocate_rbuf_ring(struct io_zcrx_ifq *ifq,
        void *ptr;
        int ret;
 
-       off = sizeof(struct io_uring);
+       off = ALIGN(sizeof(struct io_uring), L1_CACHE_BYTES);
        size = off + sizeof(struct io_uring_zcrx_rqe) * reg->rq_entries;
        if (size > rd->size)
                return -EINVAL;
@@ -367,6 +367,10 @@ static int io_allocate_rbuf_ring(struct io_zcrx_ifq *ifq,
        ptr = io_region_get_ptr(&ifq->region);
        ifq->rq_ring = (struct io_uring *)ptr;
        ifq->rqes = (struct io_uring_zcrx_rqe *)(ptr + off);
+
+       reg->offsets.head = offsetof(struct io_uring, head);
+       reg->offsets.tail = offsetof(struct io_uring, tail);
+       reg->offsets.rqes = off;
        return 0;
 }
 
@@ -618,9 +622,6 @@ int io_register_zcrx_ifq(struct io_ring_ctx *ctx,
                goto err;
        ifq->if_rxq = reg.if_rxq;
 
-       reg.offsets.rqes = sizeof(struct io_uring);
-       reg.offsets.head = offsetof(struct io_uring, head);
-       reg.offsets.tail = offsetof(struct io_uring, tail);
        reg.zcrx_id = id;
 
        scoped_guard(mutex, &ctx->mmap_lock) {