Re: [PATCH io_uring 02/16] io_uring/zcrx: move RQ head/tail to separate cache lines

Mina Almasry <[email protected]>
Newsgroups org.kernel.vger.io-uring,org.kernel.vger.netdev
Message-ID <CAHS8izN4SAUCUQySd+VTbdayX-Stj+eYOqAof+Vhi=EsRb93_w@mail.gmail.com>
On Fri, Aug 7, 2026 at 6:25 AM Pavel Begunkov <[email protected]> wrote:
>
> RQ head and tail are currently put into the same cache line, which can
> cause false sharing problems when refill is run on another CPU. Put them
> into separate cache lines.
>
> Signed-off-by: Pavel Begunkov <[email protected]>
> ---
>  io_uring/query.c | 2 +-
>  io_uring/zcrx.c  | 8 ++++----
>  io_uring/zcrx.h  | 7 ++++++-
>  3 files changed, 11 insertions(+), 6 deletions(-)
>
> diff --git a/io_uring/query.c b/io_uring/query.c
> index 88a325736992..4321f0b94b4b 100644
> --- a/io_uring/query.c
> +++ b/io_uring/query.c
> @@ -38,7 +38,7 @@ static ssize_t io_query_zcrx(union io_query_data *data)
>         e->register_flags = ZCRX_SUPPORTED_REG_FLAGS;
>         e->area_flags = IORING_ZCRX_AREA_DMABUF;
>         e->nr_ctrl_opcodes = __ZCRX_CTRL_LAST;
> -       e->rq_hdr_size = sizeof(struct io_uring);
> +       e->rq_hdr_size = sizeof(struct zcrx_rq_hdr);
>         e->rq_hdr_alignment = L1_CACHE_BYTES;
>         e->features = ZCRX_FEATURES;
>         e->__resv2 = 0;
> diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c
> index a096d44f7b52..fbc190075e2f 100644
> --- a/io_uring/zcrx.c
> +++ b/io_uring/zcrx.c
> @@ -379,9 +379,9 @@ static void io_zcrx_get_niov_uref(struct net_iov *niov)
>
>  static void io_fill_zcrx_offsets(struct io_uring_zcrx_offsets *offsets)
>  {
> -       offsets->head = offsetof(struct io_uring, head);
> -       offsets->tail = offsetof(struct io_uring, tail);
> -       offsets->rqes = ALIGN(sizeof(struct io_uring), L1_CACHE_BYTES);
> +       offsets->head = offsetof(struct zcrx_rq_hdr, head);
> +       offsets->tail = offsetof(struct zcrx_rq_hdr, tail);
> +       offsets->rqes = ALIGN(sizeof(struct zcrx_rq_hdr), L1_CACHE_BYTES);
>  }
>
>  static int io_allocate_rbuf_ring(struct io_ring_ctx *ctx,
> @@ -409,7 +409,7 @@ static int io_allocate_rbuf_ring(struct io_ring_ctx *ctx,
>                 return ret;
>
>         ptr = io_region_get_ptr(&ifq->rq_region);
> -       ifq->rq.ring = (struct io_uring *)ptr;
> +       ifq->rq.ring = (struct zcrx_rq_hdr *)ptr;
>         ifq->rq.rqes = (struct io_uring_zcrx_rqe *)(ptr + off);
>
>         memset(ifq->rq.ring, 0, sizeof(*ifq->rq.ring));
> diff --git a/io_uring/zcrx.h b/io_uring/zcrx.h
> index c1005f23caff..9ae0bf1c632f 100644
> --- a/io_uring/zcrx.h
> +++ b/io_uring/zcrx.h
> @@ -44,9 +44,14 @@ struct io_zcrx_area {
>         struct io_zcrx_mem      mem;
>  };
>
> +struct zcrx_rq_hdr {
> +       u32             head ____cacheline_aligned_in_smp;
> +       u32             tail ____cacheline_aligned_in_smp;
> +};
> +
>  struct zcrx_rq {
>         spinlock_t                      lock;
> -       struct io_uring                 *ring;
> +       struct zcrx_rq_hdr              *ring;

Is this not a problem in general for everything/most/a lot of using
struct io_uring? Should you make this change to struct io_uring
itself?

-- 
Thanks,
Mina
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.