On 8/14/22 3:31 AM, Stefan Metzmacher wrote: > Hi Pavel, > >> io_uring handles short sends/recvs for stream sockets when MSG_WAITALL >> is set, however new zerocopy send is inconsistent in this regard, which >> might be confusing. Handle short sends. >> >> Signed-off-by: Pavel Begunkov <asml.silence@xxxxxxxxx> >> --- >> io_uring/net.c | 20 +++++++++++++++++--- >> 1 file changed, 17 insertions(+), 3 deletions(-) >> >> diff --git a/io_uring/net.c b/io_uring/net.c >> index 32fc3da04e41..f9f080b3cc1e 100644 >> --- a/io_uring/net.c >> +++ b/io_uring/net.c >> @@ -70,6 +70,7 @@ struct io_sendzc { >> unsigned flags; >> unsigned addr_len; >> void __user *addr; >> + size_t done_io; >> }; >> #define IO_APOLL_MULTI_POLLED (REQ_F_APOLL_MULTISHOT | REQ_F_POLLED) >> @@ -878,6 +879,7 @@ int io_sendzc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) >> zc->addr = u64_to_user_ptr(READ_ONCE(sqe->addr2)); >> zc->addr_len = READ_ONCE(sqe->addr_len); >> + zc->done_io = 0; >> #ifdef CONFIG_COMPAT >> if (req->ctx->compat) >> @@ -1012,11 +1014,23 @@ int io_sendzc(struct io_kiocb *req, unsigned int issue_flags) >> if (unlikely(ret < min_ret)) { >> if (ret == -EAGAIN && (issue_flags & IO_URING_F_NONBLOCK)) >> return -EAGAIN; >> - return ret == -ERESTARTSYS ? -EINTR : ret; >> + if (ret > 0 && io_net_retry(sock, msg.msg_flags)) { >> + zc->len -= ret; >> + zc->buf += ret; >> + zc->done_io += ret; >> + req->flags |= REQ_F_PARTIAL_IO; > > Don't we need a prep_async function and/or something like > io_setup_async_msg() here to handle address? I don't think so, it's a non-vectored interface, so all the state is already in io_sendzc. -- Jens Axboe