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
parent
5a8b6e7c1d
commit
8fd08d8dda
|
|
@ -750,6 +750,28 @@ static struct io_uring_zcrx_rqe *io_zcrx_get_rqe(struct io_zcrx_ifq *ifq,
|
|||
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,
|
||||
struct io_zcrx_ifq *ifq)
|
||||
{
|
||||
|
|
@ -765,23 +787,11 @@ static void io_zcrx_ring_refill(struct page_pool *pp,
|
|||
|
||||
do {
|
||||
struct io_uring_zcrx_rqe *rqe = io_zcrx_get_rqe(ifq, mask);
|
||||
struct io_zcrx_area *area;
|
||||
struct net_iov *niov;
|
||||
unsigned niov_idx, area_idx;
|
||||
netmem_ref netmem;
|
||||
|
||||
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))
|
||||
if (!io_parse_rqe(rqe, ifq, &niov))
|
||||
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))
|
||||
continue;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue