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