[PATCH review-only 17/17] io_uring/zcrx: don't reload skb_shinfo
Pavel Begunkov <[email protected]> Sat, 11 Jul 2026 11:40:10 +0100
| Newsgroups | org.kernel.vger.io-uring,org.kernel.vger.netdev |
|---|---|
| Message-ID | <a190271e54e46afe752ee37411bc0ac46d87a11b.1783616211.git.asml.silence@gmail.com> |
Keep skb_shinfo in a local variable so that it doesn't reload it on every iteration of the loop. Signed-off-by: Pavel Begunkov <[email protected]> --- io_uring/zcrx.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c index 74046a09911a..0aa6455971d6 100644 --- a/io_uring/zcrx.c +++ b/io_uring/zcrx.c @@ -1836,6 +1836,7 @@ io_zcrx_recv_skb(read_descriptor_t *desc, struct sk_buff *skb, struct io_kiocb *req = args->req; struct sk_buff *frag_iter; unsigned start, start_off = offset; + struct skb_shared_info *shi; int i, ret = 0; len = min_t(size_t, len, desc->count); @@ -1871,17 +1872,15 @@ io_zcrx_recv_skb(read_descriptor_t *desc, struct sk_buff *skb, } start = skb_headlen(skb); + shi = skb_shinfo(skb); - for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { - const skb_frag_t *frag; - unsigned frag_end; + for (i = 0; i < shi->nr_frags; i++) { + const skb_frag_t *frag = &shi->frags[i]; + unsigned frag_end = start + skb_frag_size(frag); if (WARN_ON(start > offset + len)) return -EFAULT; - frag = &skb_shinfo(skb)->frags[i]; - frag_end = start + skb_frag_size(frag); - if (offset < frag_end) { unsigned copy = min(frag_end - offset, len); unsigned frag_off = offset - start; -- 2.54.0