]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
io_uring/zcrx: introduce io_parse_rqe()
authorPavel Begunkov <asml.silence@gmail.com>
Tue, 16 Sep 2025 14:28:01 +0000 (15:28 +0100)
committerJens Axboe <axboe@kernel.dk>
Tue, 16 Sep 2025 18:37:21 +0000 (12:37 -0600)
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>
io_uring/zcrx.c

index a805f744c774d41229b4bbc3e2b52664b21e9bcc..81d4aa75a69fbe80579445717f74caa67885c483 100644 (file)
@@ -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;