[RFC 3/9] io_uring/zcrx: don't save/restore count for frag skbs
Pavel Begunkov <[email protected]> Sat, 11 Jul 2026 10:22:13 +0100
| Newsgroups | org.kernel.vger.io-uring,org.kernel.vger.netdev |
|---|---|
| Message-ID | <1279bf7c6c379945e57dce4d7366c1764a3fb938.1783619193.git.asml.silence@gmail.com> |
We save and restore desc->count before recursing for frag skb processing. Extract the handling into a separate function instead and pass a flag. Signed-off-by: Pavel Begunkov <[email protected]> --- io_uring/zcrx.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c index 0aa6455971d6..816a169b848e 100644 --- a/io_uring/zcrx.c +++ b/io_uring/zcrx.c @@ -1827,9 +1827,8 @@ static int io_zcrx_recv_frag(struct io_kiocb *req, struct io_zcrx_ifq *ifq, return len; } -static int -io_zcrx_recv_skb(read_descriptor_t *desc, struct sk_buff *skb, - unsigned int offset, size_t len) +static int __zcrx_recv_skb(read_descriptor_t *desc, struct sk_buff *skb, + unsigned int offset, size_t len) { struct io_zcrx_args *args = desc->arg.data; struct io_zcrx_ifq *ifq = args->ifq; @@ -1907,11 +1906,8 @@ io_zcrx_recv_skb(read_descriptor_t *desc, struct sk_buff *skb, if (offset < frag_end) { unsigned copy = min(frag_end - offset, len); unsigned frag_off = offset - start; - size_t count; - count = desc->count; - ret = io_zcrx_recv_skb(desc, frag_iter, frag_off, copy); - desc->count = count; + ret = __zcrx_recv_skb(desc, frag_iter, frag_off, copy); if (ret < 0) goto out; @@ -1926,10 +1922,20 @@ io_zcrx_recv_skb(read_descriptor_t *desc, struct sk_buff *skb, out: if (offset == start_off) return ret; - desc->count -= (offset - start_off); return offset - start_off; } +static +int io_zcrx_recv_skb(read_descriptor_t *desc, struct sk_buff *skb, + unsigned int offset, size_t len) +{ + int ret; + + ret = __zcrx_recv_skb(desc, skb, offset, len); + desc->count -= max(0, ret); + return ret; +} + static int io_zcrx_tcp_recvmsg(struct io_kiocb *req, struct io_zcrx_ifq *ifq, struct sock *sk, int flags, unsigned issue_flags, unsigned int *outlen) -- 2.54.0