Loading io_uring/zcrx.c +23 −13 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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 Loading
io_uring/zcrx.c +23 −13 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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