FAILED: patch "[PATCH] io_uring/net: don't skip notifs for failed requests" failed to apply to 6.0-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.0-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
Possible dependencies:
6ae91ac9a6aa ("io_uring/net: don't skip notifs for failed requests") a75155faef4e ("io_uring/net: fix UAF in io_sendrecv_fail()") 493108d95f14 ("io_uring/net: zerocopy sendmsg") c4c0009e0b56 ("io_uring/net: combine fail handlers") b0e9b5517eb1 ("io_uring/net: rename io_sendzc()") 516e82f0e043 ("io_uring/net: support non-zerocopy sendto") 6ae61b7aa2c7 ("io_uring/net: refactor io_setup_async_addr") 5693bcce892d ("io_uring/net: don't lose partial send_zc on fail") 7e6b638ed501 ("io_uring/net: don't lose partial send/recv on fail") ac9e5784bbe7 ("io_uring/net: use io_sr_msg for sendzc") 0b048557db76 ("io_uring/net: refactor io_sr_msg types") 6bf8ad25fcd4 ("io_uring/net: io_async_msghdr caches for sendzc") 95eafc74be5e ("io_uring/net: reshuffle error handling")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 6ae91ac9a6aa7d6005c3c6d0f4d263fbab9f377f Mon Sep 17 00:00:00 2001
From: Pavel Begunkov <[email protected]>
Date: Wed, 28 Sep 2022 00:51:49 +0100
Subject: [PATCH] io_uring/net: don't skip notifs for failed requests
We currently only add a notification CQE when the send succeded, i.e. cqe.res >= 0. However, it'd be more robust to do buffer notifications for failed requests as well in case drivers decide do something fanky.
Always return a buffer notification after initial prep, don't hide it. This behaviour is better aligned with documentation and the patch also helps the userspace to respect it.
io_uring/net.c +8 -21
@@ -916,7 +916,6 @@ void io_send_zc_cleanup(struct io_kiocb *req)kfree (io->free_iov); }if (zc->notif) { - zc->notif->flags |=REQ_F_CQE_SKIP ;io_notif_flush (zc->notif); zc->notif =NULL ; }
@@ -1047,7 +1046,7 @@ int io_send_zc(struct io_kiocb *req, unsigned int issue_flags)struct msghdr msg;struct iovec iov;struct socket *sock; -unsigned msg_flags, cflags; +unsigned msg_flags;int ret, min_ret =0 ; sock =sock_from_file (req->file);
@@ -1115,8 +1114,6 @@ int io_send_zc(struct io_kiocb *req, unsigned int issue_flags) req->flags |=REQ_F_PARTIAL_IO ;return io_setup_async_addr (req, &__address, issue_flags); } -if (ret <0 && !zc->done_io) - zc->notif->flags |=REQ_F_CQE_SKIP ;if (ret == -ERESTARTSYS ) ret = -EINTR ;req_set_fail (req);
@@ -1129,8 +1126,7 @@ int io_send_zc(struct io_kiocb *req, unsigned int issue_flags)io_notif_flush (zc->notif); req->flags &= ~REQ_F_NEED_CLEANUP ; - cflags = ret >=0 ?IORING_CQE_F_MORE :0 ; -io_req_set_res (req, ret, cflags); +io_req_set_res (req, ret,IORING_CQE_F_MORE );return IOU_OK ; }
@@ -1139,7 +1135,7 @@ int io_sendmsg_zc(struct io_kiocb *req, unsigned int issue_flags) struct io_sr_msg *sr = io_kiocb_to_cmd(req, struct io_sr_msg);struct io_async_msghdr iomsg, *kmsg;struct socket *sock; -unsigned flags, cflags; +unsigned flags;int ret, min_ret =0 ; sock =sock_from_file (req->file);
@@ -1178,8 +1174,6 @@ int io_sendmsg_zc(struct io_kiocb *req, unsigned int issue_flags) req->flags |=REQ_F_PARTIAL_IO ;return io_setup_async_msg (req, kmsg, issue_flags); } -if (ret <0 && !sr->done_io) - sr->notif->flags |=REQ_F_CQE_SKIP ;if (ret == -ERESTARTSYS ) ret = -EINTR ;req_set_fail (req);
@@ -1196,27 +1190,20 @@ int io_sendmsg_zc(struct io_kiocb *req, unsigned int issue_flags)io_notif_flush (sr->notif); req->flags &= ~REQ_F_NEED_CLEANUP ; - cflags = ret >=0 ?IORING_CQE_F_MORE :0 ; -io_req_set_res (req, ret, cflags); +io_req_set_res (req, ret,IORING_CQE_F_MORE );return IOU_OK ; }void io_sendrecv_fail (struct io_kiocb *req) { struct io_sr_msg *sr = io_kiocb_to_cmd(req, struct io_sr_msg); -int res = req->cqe.res;if (req->flags &REQ_F_PARTIAL_IO ) - res = sr->done_io; + req->cqe.res = sr->done_io; +if ((req->flags &REQ_F_NEED_CLEANUP ) && - (req->opcode ==IORING_OP_SEND_ZC || req->opcode ==IORING_OP_SENDMSG_ZC )) { -/* preserve notification for partial I/O */ -if (res <0 ) - sr->notif->flags |=REQ_F_CQE_SKIP ; -io_notif_flush (sr->notif); - sr->notif =NULL ; - } -io_req_set_res (req, res, req->cqe.flags); + (req->opcode ==IORING_OP_SEND_ZC || req->opcode ==IORING_OP_SENDMSG_ZC )) + req->cqe.flags |=IORING_CQE_F_MORE ; }int io_accept_prep (struct io_kiocb *req,const struct io_uring_sqe *sqe)