From: Greg Kroah-Hartman Date: Mon, 17 Oct 2022 09:35:49 +0000 (+0200) Subject: 6.0-stable patches X-Git-Tag: v5.4.219~34 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8f9c997e6243a5a41cf1c0b4dae9052babd8862e;p=thirdparty%2Fkernel%2Fstable-queue.git 6.0-stable patches added patches: io_uring-net-don-t-lose-partial-send_zc-on-fail.patch io_uring-net-don-t-skip-notifs-for-failed-requests.patch io_uring-net-fix-notif-cqe-reordering.patch io_uring-net-refactor-io_sr_msg-types.patch io_uring-net-rename-io_sendzc.patch io_uring-net-use-io_sr_msg-for-sendzc.patch --- diff --git a/queue-6.0/io_uring-net-don-t-lose-partial-send_zc-on-fail.patch b/queue-6.0/io_uring-net-don-t-lose-partial-send_zc-on-fail.patch new file mode 100644 index 00000000000..d9345378df9 --- /dev/null +++ b/queue-6.0/io_uring-net-don-t-lose-partial-send_zc-on-fail.patch @@ -0,0 +1,72 @@ +From foo@baz Mon Oct 17 11:35:32 AM CEST 2022 +From: Pavel Begunkov +Date: Sun, 16 Oct 2022 21:33:27 +0100 +Subject: io_uring/net: don't lose partial send_zc on fail +To: stable@vger.kernel.org +Cc: Jens Axboe , asml.silence@gmail.com +Message-ID: <3493fc0ee75f3cf8a111e2e8e1a35f833f29aaf2.1665951939.git.asml.silence@gmail.com> + +From: Pavel Begunkov + +[ upstream commit 5693bcce892d7b8b15a7a92b011d3d40a023b53c ] + +Partial zc send may end up in io_req_complete_failed(), which not only +would return invalid result but also mask out the notification leading +to lifetime issues. + +Cc: stable@vger.kernel.org +Signed-off-by: Pavel Begunkov +Link: https://lore.kernel.org/r/5673285b5e83e6ceca323727b4ddaa584b5cc91e.1663668091.git.asml.silence@gmail.com +Signed-off-by: Jens Axboe +Signed-off-by: Greg Kroah-Hartman +--- + io_uring/net.c | 16 ++++++++++++++++ + io_uring/net.h | 1 + + io_uring/opdef.c | 1 + + 3 files changed, 18 insertions(+) + +--- a/io_uring/net.c ++++ b/io_uring/net.c +@@ -1093,6 +1093,22 @@ void io_sendrecv_fail(struct io_kiocb *r + io_req_set_res(req, res, req->cqe.flags); + } + ++void io_send_zc_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) { ++ if (req->flags & REQ_F_NEED_CLEANUP) { ++ io_notif_flush(sr->notif); ++ sr->notif = NULL; ++ req->flags &= ~REQ_F_NEED_CLEANUP; ++ } ++ res = sr->done_io; ++ } ++ io_req_set_res(req, res, req->cqe.flags); ++} ++ + int io_accept_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) + { + struct io_accept *accept = io_kiocb_to_cmd(req, struct io_accept); +--- a/io_uring/net.h ++++ b/io_uring/net.h +@@ -58,6 +58,7 @@ int io_connect(struct io_kiocb *req, uns + int io_sendzc(struct io_kiocb *req, unsigned int issue_flags); + int io_sendzc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe); + void io_sendzc_cleanup(struct io_kiocb *req); ++void io_send_zc_fail(struct io_kiocb *req); + + void io_netmsg_cache_free(struct io_cache_entry *entry); + #else +--- a/io_uring/opdef.c ++++ b/io_uring/opdef.c +@@ -494,6 +494,7 @@ const struct io_op_def io_op_defs[] = { + .issue = io_sendzc, + .prep_async = io_sendzc_prep_async, + .cleanup = io_sendzc_cleanup, ++ .fail = io_send_zc_fail, + #else + .prep = io_eopnotsupp_prep, + #endif diff --git a/queue-6.0/io_uring-net-don-t-skip-notifs-for-failed-requests.patch b/queue-6.0/io_uring-net-don-t-skip-notifs-for-failed-requests.patch new file mode 100644 index 00000000000..fd088acdc05 --- /dev/null +++ b/queue-6.0/io_uring-net-don-t-skip-notifs-for-failed-requests.patch @@ -0,0 +1,90 @@ +From foo@baz Mon Oct 17 11:35:32 AM CEST 2022 +From: Pavel Begunkov +Date: Sun, 16 Oct 2022 21:33:29 +0100 +Subject: io_uring/net: don't skip notifs for failed requests +To: stable@vger.kernel.org +Cc: Jens Axboe , asml.silence@gmail.com +Message-ID: <6e84a6e0dbfbbb43379a82abd262ce0bd4311ca2.1665951939.git.asml.silence@gmail.com> + +From: Pavel Begunkov + +[ upstream commit 6ae91ac9a6aa7d6005c3c6d0f4d263fbab9f377f ] + +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. + +Cc: stable@vger.kernel.org # 6.0 +Suggested-by: Stefan Metzmacher +Signed-off-by: Pavel Begunkov +Link: https://lore.kernel.org/r/9c8bead87b2b980fcec441b8faef52188b4a6588.1664292100.git.asml.silence@gmail.com +Signed-off-by: Jens Axboe +Signed-off-by: Greg Kroah-Hartman +--- + io_uring/net.c | 22 ++++++---------------- + 1 file changed, 6 insertions(+), 16 deletions(-) + +--- a/io_uring/net.c ++++ b/io_uring/net.c +@@ -879,7 +879,6 @@ void io_send_zc_cleanup(struct io_kiocb + { + struct io_sr_msg *zc = io_kiocb_to_cmd(req, struct io_sr_msg); + +- zc->notif->flags |= REQ_F_CQE_SKIP; + io_notif_flush(zc->notif); + zc->notif = NULL; + } +@@ -996,7 +995,7 @@ int io_send_zc(struct io_kiocb *req, uns + 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); +@@ -1064,8 +1063,6 @@ int io_send_zc(struct io_kiocb *req, uns + req->flags |= REQ_F_PARTIAL_IO; + return io_setup_async_addr(req, addr, issue_flags); + } +- if (ret < 0 && !zc->done_io) +- zc->notif->flags |= REQ_F_CQE_SKIP; + if (ret == -ERESTARTSYS) + ret = -EINTR; + req_set_fail(req); +@@ -1078,8 +1075,7 @@ int io_send_zc(struct io_kiocb *req, uns + + 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; + } + +@@ -1096,17 +1092,11 @@ void io_sendrecv_fail(struct io_kiocb *r + void io_send_zc_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) { +- if (req->flags & REQ_F_NEED_CLEANUP) { +- io_notif_flush(sr->notif); +- sr->notif = NULL; +- req->flags &= ~REQ_F_NEED_CLEANUP; +- } +- res = sr->done_io; +- } +- io_req_set_res(req, res, req->cqe.flags); ++ if (req->flags & REQ_F_PARTIAL_IO) ++ req->cqe.res = sr->done_io; ++ if (req->flags & REQ_F_NEED_CLEANUP) ++ req->cqe.flags |= IORING_CQE_F_MORE; + } + + int io_accept_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) diff --git a/queue-6.0/io_uring-net-fix-notif-cqe-reordering.patch b/queue-6.0/io_uring-net-fix-notif-cqe-reordering.patch new file mode 100644 index 00000000000..6aa82d2a984 --- /dev/null +++ b/queue-6.0/io_uring-net-fix-notif-cqe-reordering.patch @@ -0,0 +1,46 @@ +From foo@baz Mon Oct 17 11:35:32 AM CEST 2022 +From: Pavel Begunkov +Date: Sun, 16 Oct 2022 21:33:30 +0100 +Subject: io_uring/net: fix notif cqe reordering +To: stable@vger.kernel.org +Cc: Jens Axboe , asml.silence@gmail.com +Message-ID: <54ecb468aac60ed3f6165be94144044cf62bbe58.1665951939.git.asml.silence@gmail.com> + +From: Pavel Begunkov + +[ upstream commit 108893ddcc4d3aa0a4a02aeb02d478e997001227 ] + +send zc is not restricted to !IO_URING_F_UNLOCKED anymore and so +we can't use task-tw ordering trick to order notification cqes +with requests completions. In this case leave it alone and let +io_send_zc_cleanup() flush it. + +Cc: stable@vger.kernel.org +Fixes: 53bdc88aac9a2 ("io_uring/notif: order notif vs send CQEs") +Signed-off-by: Pavel Begunkov +Link: https://lore.kernel.org/r/0031f3a00d492e814a4a0935a2029a46d9c9ba06.1664486545.git.asml.silence@gmail.com +Signed-off-by: Jens Axboe +Signed-off-by: Greg Kroah-Hartman +--- + io_uring/net.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +--- a/io_uring/net.c ++++ b/io_uring/net.c +@@ -1073,8 +1073,14 @@ int io_send_zc(struct io_kiocb *req, uns + else if (zc->done_io) + ret = zc->done_io; + +- io_notif_flush(zc->notif); +- req->flags &= ~REQ_F_NEED_CLEANUP; ++ /* ++ * If we're in io-wq we can't rely on tw ordering guarantees, defer ++ * flushing notif to io_send_zc_cleanup() ++ */ ++ if (!(issue_flags & IO_URING_F_UNLOCKED)) { ++ io_notif_flush(zc->notif); ++ req->flags &= ~REQ_F_NEED_CLEANUP; ++ } + io_req_set_res(req, ret, IORING_CQE_F_MORE); + return IOU_OK; + } diff --git a/queue-6.0/io_uring-net-refactor-io_sr_msg-types.patch b/queue-6.0/io_uring-net-refactor-io_sr_msg-types.patch new file mode 100644 index 00000000000..9a879f6b55a --- /dev/null +++ b/queue-6.0/io_uring-net-refactor-io_sr_msg-types.patch @@ -0,0 +1,56 @@ +From foo@baz Mon Oct 17 11:35:32 AM CEST 2022 +From: Pavel Begunkov +Date: Sun, 16 Oct 2022 21:33:25 +0100 +Subject: io_uring/net: refactor io_sr_msg types +To: stable@vger.kernel.org +Cc: Jens Axboe , asml.silence@gmail.com +Message-ID: + +From: Pavel Begunkov + +[ upstream commit 0b048557db761d287777360a100e1d010760d209 ] + +In preparation for using struct io_sr_msg for zerocopy sends, clean up +types. First, flags can be u16 as it's provided by the userspace in u16 +ioprio, as well as addr_len. This saves us 4 bytes. Also use unsigned +for size and done_io, both are as well limited to u32. + +Signed-off-by: Pavel Begunkov +Link: https://lore.kernel.org/r/42c2639d6385b8b2181342d2af3a42d3b1c5bcd2.1662639236.git.asml.silence@gmail.com +Signed-off-by: Jens Axboe +Signed-off-by: Greg Kroah-Hartman +--- + io_uring/net.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +--- a/io_uring/net.c ++++ b/io_uring/net.c +@@ -56,21 +56,21 @@ struct io_sr_msg { + struct user_msghdr __user *umsg; + void __user *buf; + }; ++ unsigned len; ++ unsigned done_io; + unsigned msg_flags; +- unsigned flags; +- size_t len; +- size_t done_io; ++ u16 flags; + }; + + struct io_sendzc { + struct file *file; + void __user *buf; +- size_t len; ++ unsigned len; ++ unsigned done_io; + unsigned msg_flags; +- unsigned flags; +- unsigned addr_len; ++ u16 flags; ++ u16 addr_len; + void __user *addr; +- size_t done_io; + struct io_kiocb *notif; + }; + diff --git a/queue-6.0/io_uring-net-rename-io_sendzc.patch b/queue-6.0/io_uring-net-rename-io_sendzc.patch new file mode 100644 index 00000000000..2e4c2b2344c --- /dev/null +++ b/queue-6.0/io_uring-net-rename-io_sendzc.patch @@ -0,0 +1,85 @@ +From foo@baz Mon Oct 17 11:35:32 AM CEST 2022 +From: Pavel Begunkov +Date: Sun, 16 Oct 2022 21:33:28 +0100 +Subject: io_uring/net: rename io_sendzc() +To: stable@vger.kernel.org +Cc: Jens Axboe , asml.silence@gmail.com +Message-ID: <7f580aebe73419deff39d7300544b1ca559a9057.1665951939.git.asml.silence@gmail.com> + +From: Pavel Begunkov + +[ upstream commit b0e9b5517eb12fa80c72e205fe28534c2e2f39b9 ] + +Simple renaming of io_sendzc*() functions in preparatio to adding +a zerocopy sendmsg variant. + +Signed-off-by: Pavel Begunkov +Link: https://lore.kernel.org/r/265af46829e6076dd220011b1858dc3151969226.1663668091.git.asml.silence@gmail.com +Signed-off-by: Jens Axboe +Signed-off-by: Greg Kroah-Hartman +--- + io_uring/net.c | 6 +++--- + io_uring/net.h | 6 +++--- + io_uring/opdef.c | 6 +++--- + 3 files changed, 9 insertions(+), 9 deletions(-) + +--- a/io_uring/net.c ++++ b/io_uring/net.c +@@ -875,7 +875,7 @@ out_free: + return ret; + } + +-void io_sendzc_cleanup(struct io_kiocb *req) ++void io_send_zc_cleanup(struct io_kiocb *req) + { + struct io_sr_msg *zc = io_kiocb_to_cmd(req, struct io_sr_msg); + +@@ -884,7 +884,7 @@ void io_sendzc_cleanup(struct io_kiocb * + zc->notif = NULL; + } + +-int io_sendzc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) ++int io_send_zc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) + { + struct io_sr_msg *zc = io_kiocb_to_cmd(req, struct io_sr_msg); + struct io_ring_ctx *ctx = req->ctx; +@@ -989,7 +989,7 @@ static int io_sg_from_iter(struct sock * + return ret; + } + +-int io_sendzc(struct io_kiocb *req, unsigned int issue_flags) ++int io_send_zc(struct io_kiocb *req, unsigned int issue_flags) + { + struct sockaddr_storage __address, *addr = NULL; + struct io_sr_msg *zc = io_kiocb_to_cmd(req, struct io_sr_msg); +--- a/io_uring/net.h ++++ b/io_uring/net.h +@@ -55,9 +55,9 @@ int io_connect_prep_async(struct io_kioc + int io_connect_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe); + int io_connect(struct io_kiocb *req, unsigned int issue_flags); + +-int io_sendzc(struct io_kiocb *req, unsigned int issue_flags); +-int io_sendzc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe); +-void io_sendzc_cleanup(struct io_kiocb *req); ++int io_send_zc(struct io_kiocb *req, unsigned int issue_flags); ++int io_send_zc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe); ++void io_send_zc_cleanup(struct io_kiocb *req); + void io_send_zc_fail(struct io_kiocb *req); + + void io_netmsg_cache_free(struct io_cache_entry *entry); +--- a/io_uring/opdef.c ++++ b/io_uring/opdef.c +@@ -490,10 +490,10 @@ const struct io_op_def io_op_defs[] = { + .manual_alloc = 1, + #if defined(CONFIG_NET) + .async_size = sizeof(struct io_async_msghdr), +- .prep = io_sendzc_prep, +- .issue = io_sendzc, ++ .prep = io_send_zc_prep, ++ .issue = io_send_zc, + .prep_async = io_sendzc_prep_async, +- .cleanup = io_sendzc_cleanup, ++ .cleanup = io_send_zc_cleanup, + .fail = io_send_zc_fail, + #else + .prep = io_eopnotsupp_prep, diff --git a/queue-6.0/io_uring-net-use-io_sr_msg-for-sendzc.patch b/queue-6.0/io_uring-net-use-io_sr_msg-for-sendzc.patch new file mode 100644 index 00000000000..a4acefb886c --- /dev/null +++ b/queue-6.0/io_uring-net-use-io_sr_msg-for-sendzc.patch @@ -0,0 +1,79 @@ +From foo@baz Mon Oct 17 11:35:32 AM CEST 2022 +From: Pavel Begunkov +Date: Sun, 16 Oct 2022 21:33:26 +0100 +Subject: io_uring/net: use io_sr_msg for sendzc +To: stable@vger.kernel.org +Cc: Jens Axboe , asml.silence@gmail.com +Message-ID: + +From: Pavel Begunkov + +[ upstream commit ac9e5784bbe72f4f603d1af84760ec09bc0b5ccd ] + +Reuse struct io_sr_msg for zerocopy sends, which is handy. There is +only one zerocopy specific field, namely .notif, and we have enough +space for it. + +Signed-off-by: Pavel Begunkov +Link: https://lore.kernel.org/r/408c5b1b2d8869e1a12da5f5a78ed72cac112149.1662639236.git.asml.silence@gmail.com +Signed-off-by: Jens Axboe +Signed-off-by: Greg Kroah-Hartman +--- + io_uring/net.c | 18 +++++------------- + 1 file changed, 5 insertions(+), 13 deletions(-) + +--- a/io_uring/net.c ++++ b/io_uring/net.c +@@ -60,15 +60,7 @@ struct io_sr_msg { + unsigned done_io; + unsigned msg_flags; + u16 flags; +-}; +- +-struct io_sendzc { +- struct file *file; +- void __user *buf; +- unsigned len; +- unsigned done_io; +- unsigned msg_flags; +- u16 flags; ++ /* used only for sendzc */ + u16 addr_len; + void __user *addr; + struct io_kiocb *notif; +@@ -188,7 +180,7 @@ static int io_sendmsg_copy_hdr(struct io + + int io_sendzc_prep_async(struct io_kiocb *req) + { +- struct io_sendzc *zc = io_kiocb_to_cmd(req, struct io_sendzc); ++ struct io_sr_msg *zc = io_kiocb_to_cmd(req, struct io_sr_msg); + struct io_async_msghdr *io; + int ret; + +@@ -885,7 +877,7 @@ out_free: + + void io_sendzc_cleanup(struct io_kiocb *req) + { +- struct io_sendzc *zc = io_kiocb_to_cmd(req, struct io_sendzc); ++ struct io_sr_msg *zc = io_kiocb_to_cmd(req, struct io_sr_msg); + + zc->notif->flags |= REQ_F_CQE_SKIP; + io_notif_flush(zc->notif); +@@ -894,7 +886,7 @@ void io_sendzc_cleanup(struct io_kiocb * + + int io_sendzc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) + { +- struct io_sendzc *zc = io_kiocb_to_cmd(req, struct io_sendzc); ++ struct io_sr_msg *zc = io_kiocb_to_cmd(req, struct io_sr_msg); + struct io_ring_ctx *ctx = req->ctx; + struct io_kiocb *notif; + +@@ -1000,7 +992,7 @@ static int io_sg_from_iter(struct sock * + int io_sendzc(struct io_kiocb *req, unsigned int issue_flags) + { + struct sockaddr_storage __address, *addr = NULL; +- struct io_sendzc *zc = io_kiocb_to_cmd(req, struct io_sendzc); ++ struct io_sr_msg *zc = io_kiocb_to_cmd(req, struct io_sr_msg); + struct msghdr msg; + struct iovec iov; + struct socket *sock; diff --git a/queue-6.0/series b/queue-6.0/series index 2ad3d2d50a4..bb2a3229462 100644 --- a/queue-6.0/series +++ b/queue-6.0/series @@ -932,3 +932,9 @@ net-sparx5-fix-return-type-of-sparx5_port_xmit_impl.patch perf-skip-and-warn-on-unknown-format-confign-attrs.patch perf-intel-pt-fix-segfault-in-intel_pt_print_info-with-uclibc.patch perf-intel-pt-fix-system_wide-dummy-event-for-hybrid.patch +io_uring-net-refactor-io_sr_msg-types.patch +io_uring-net-use-io_sr_msg-for-sendzc.patch +io_uring-net-don-t-lose-partial-send_zc-on-fail.patch +io_uring-net-rename-io_sendzc.patch +io_uring-net-don-t-skip-notifs-for-failed-requests.patch +io_uring-net-fix-notif-cqe-reordering.patch