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 --- 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 2ea1e79ca8a2..bea606beaf4f 100644 --- a/io_uring/zcrx.c +++ b/io_uring/zcrx.c @@ -1693,6 +1693,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); @@ -1728,17 +1729,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