On 2025-02-21 16:56, Pavel Begunkov wrote: > On 2/21/25 20:51, David Wei wrote: >> diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c >> index f2d326e18e67..74bca4e471bc 100644 >> --- a/io_uring/zcrx.c >> +++ b/io_uring/zcrx.c > ... >> static int io_zcrx_tcp_recvmsg(struct io_kiocb *req, struct io_zcrx_ifq *ifq, >> struct sock *sk, int flags, >> - unsigned issue_flags) >> + unsigned issue_flags, unsigned int *outlen) >> { >> + unsigned int len = *outlen; >> + bool limit = len != UINT_MAX; >> struct io_zcrx_args args = { >> .req = req, >> .ifq = ifq, >> .sock = sk->sk_socket, >> }; >> read_descriptor_t rd_desc = { >> - .count = 1, >> + .count = len, >> .arg.data = &args, >> }; >> int ret; >> lock_sock(sk); >> ret = tcp_read_sock(sk, &rd_desc, io_zcrx_recv_skb); >> + if (limit && ret) >> + *outlen = len - ret; > > ret can be negative, the check will pass and the calculations > will turn it into something weird. > :facepalm: ret is an int and if (ret) is any non-zero value... I'll be more explicit here to say ret > 0