[RFC 8/9] io_uring/zcrx: steal niov refs
Pavel Begunkov <[email protected]> Sat, 11 Jul 2026 10:22:18 +0100
| Newsgroups | org.kernel.vger.io-uring,org.kernel.vger.netdev |
|---|---|
| Message-ID | <421a7de8c5ddffd3461e416998f6fb034ffb0282.1783619193.git.asml.silence@gmail.com> |
In zcrx_release_skbs(), we reference all niovs of an skb and then immediately put them down. Optimise it by stealing the frags. Signed-off-by: Pavel Begunkov <[email protected]> --- io_uring/zcrx.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c index 3d5d5c9fd9a5..23669471a8f0 100644 --- a/io_uring/zcrx.c +++ b/io_uring/zcrx.c @@ -1317,11 +1317,22 @@ static void zcrx_release_skbs(struct io_zcrx_ifq *ifq) { while (1) { struct sk_buff *skb = __ptr_ring_consume(&ifq->skb_ring); + struct skb_shared_info *shi; + unsigned i; if (!skb) break; - zcrx_user_ref_frags(ifq, skb, 0, -1U); + shi = skb_shinfo(skb); + for (i = 0; i < shi->nr_frags; i++) { + const skb_frag_t *frag = &shi->frags[i]; + struct net_iov *niov = netmem_to_net_iov(frag->netmem); + + /* Take niov references the skb holds */ + io_zcrx_get_niov_uref(niov); + } + shi->nr_frags = 0; + if (skb->fclone != SKB_FCLONE_UNAVAILABLE) __kfree_skb(skb); else -- 2.54.0