io_uring/zcrx: introduce io_parse_rqe()

Add a helper for verifying a rqe and extracting a niov out of it. It'll
be reused in following patches.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
pull/1354/merge
Pavel Begunkov 2025-09-16 15:28:01 +01:00 committed by Jens Axboe
parent 5a8b6e7c1d
commit 8fd08d8dda
1 changed files with 23 additions and 13 deletions

View File

@ -750,6 +750,28 @@ static struct io_uring_zcrx_rqe *io_zcrx_get_rqe(struct io_zcrx_ifq *ifq,
return &ifq->rqes[idx]; return &ifq->rqes[idx];
} }
static inline bool io_parse_rqe(struct io_uring_zcrx_rqe *rqe,
struct io_zcrx_ifq *ifq,
struct net_iov **ret_niov)
{
unsigned niov_idx, area_idx;
struct io_zcrx_area *area;
area_idx = rqe->off >> IORING_ZCRX_AREA_SHIFT;
niov_idx = (rqe->off & ~IORING_ZCRX_AREA_MASK) >> ifq->niov_shift;
if (unlikely(rqe->__pad || area_idx))
return false;
area = ifq->area;
if (unlikely(niov_idx >= area->nia.num_niovs))
return false;
niov_idx = array_index_nospec(niov_idx, area->nia.num_niovs);
*ret_niov = &area->nia.niovs[niov_idx];
return true;
}
static void io_zcrx_ring_refill(struct page_pool *pp, static void io_zcrx_ring_refill(struct page_pool *pp,
struct io_zcrx_ifq *ifq) struct io_zcrx_ifq *ifq)
{ {
@ -765,23 +787,11 @@ static void io_zcrx_ring_refill(struct page_pool *pp,
do { do {
struct io_uring_zcrx_rqe *rqe = io_zcrx_get_rqe(ifq, mask); struct io_uring_zcrx_rqe *rqe = io_zcrx_get_rqe(ifq, mask);
struct io_zcrx_area *area;
struct net_iov *niov; struct net_iov *niov;
unsigned niov_idx, area_idx;
netmem_ref netmem; netmem_ref netmem;
area_idx = rqe->off >> IORING_ZCRX_AREA_SHIFT; if (!io_parse_rqe(rqe, ifq, &niov))
niov_idx = (rqe->off & ~IORING_ZCRX_AREA_MASK) >> ifq->niov_shift;
if (unlikely(rqe->__pad || area_idx))
continue; continue;
area = ifq->area;
if (unlikely(niov_idx >= area->nia.num_niovs))
continue;
niov_idx = array_index_nospec(niov_idx, area->nia.num_niovs);
niov = &area->nia.niovs[niov_idx];
if (!io_zcrx_put_niov_uref(niov)) if (!io_zcrx_put_niov_uref(niov))
continue; continue;