FAILED: patch "[PATCH] io_uring: dont remove file from msg_ring reqs" 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:
ef0ec1ad0311 ("io_uring: dont remove file from msg_ring reqs") 5756a3a7e713 ("io_uring: add iopoll infrastructure for io_uring_cmd")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From ef0ec1ad03119b8b46b035dad42bca7d6da7c2e5 Mon Sep 17 00:00:00 2001
From: Pavel Begunkov <[email protected]>
Date: Wed, 7 Dec 2022 03:53:26 +0000
Subject: [PATCH] io_uring: dont remove file from msg_ring reqs
We should not be messing with req->file outside of core paths. Clearing it makes msg_ring non reentrant, i.e. luckily io_msg_send_fd() fails the request on failed io_double_lock_ctx() but clearly was originally intended to do retries instead.
io_uring/io_uring.c +1 -1
@@ -1799,7 +1799,7 @@ static int io_issue_sqe(struct io_kiocb *req, unsigned int issue_flags)return ret;/* If the op doesn't have a file, we're not polling for it */ -if ((req->ctx->flags &IORING_SETUP_IOPOLL ) && req->file) +if ((req->ctx->flags &IORING_SETUP_IOPOLL ) && def->iopoll_queue)io_iopoll_req_issued (req, issue_flags);return 0 ;
io_uring/msg_ring.c +0 -4
@@ -167,9 +167,5 @@ int io_msg_ring(struct io_kiocb *req, unsigned int issue_flags)if (ret <0 )req_set_fail (req);io_req_set_res (req, ret,0 ); -/* put file to avoid an attempt to IOPOLL the req */ -if (!(req->flags &REQ_F_FIXED_FILE )) -io_put_file (req->file); - req->file =NULL ;return IOU_OK ; }
io_uring/opdef.c +7 -0
@@ -63,6 +63,7 @@ const struct io_op_def io_op_defs[] = { .audit_skip = 1, .ioprio = 1, .iopoll = 1, + .iopoll_queue = 1, .async_size = sizeof(struct io_async_rw), .name = "READV", .prep = io_prep_rw,
@@ -80,6 +81,7 @@ const struct io_op_def io_op_defs[] = { .audit_skip = 1, .ioprio = 1, .iopoll = 1, + .iopoll_queue = 1, .async_size = sizeof(struct io_async_rw), .name = "WRITEV", .prep = io_prep_rw,
@@ -103,6 +105,7 @@ const struct io_op_def io_op_defs[] = { .audit_skip = 1, .ioprio = 1, .iopoll = 1, + .iopoll_queue = 1, .async_size = sizeof(struct io_async_rw), .name = "READ_FIXED", .prep = io_prep_rw,
@@ -118,6 +121,7 @@ const struct io_op_def io_op_defs[] = { .audit_skip = 1, .ioprio = 1, .iopoll = 1, + .iopoll_queue = 1, .async_size = sizeof(struct io_async_rw), .name = "WRITE_FIXED", .prep = io_prep_rw,
@@ -277,6 +281,7 @@ const struct io_op_def io_op_defs[] = { .audit_skip = 1, .ioprio = 1, .iopoll = 1, + .iopoll_queue = 1, .async_size = sizeof(struct io_async_rw), .name = "READ", .prep = io_prep_rw,
@@ -292,6 +297,7 @@ const struct io_op_def io_op_defs[] = { .audit_skip = 1, .ioprio = 1, .iopoll = 1, + .iopoll_queue = 1, .async_size = sizeof(struct io_async_rw), .name = "WRITE", .prep = io_prep_rw,
@@ -481,6 +487,7 @@ const struct io_op_def io_op_defs[] = { .plug = 1, .name = "URING_CMD", .iopoll = 1, + .iopoll_queue = 1, .async_size = uring_cmd_pdu_size(1), .prep = io_uring_cmd_prep, .issue = io_uring_cmd,
io_uring/opdef.h +2 -0
@@ -25,6 +25,8 @@ struct io_op_def { unsigned ioprio : 1;/* supports iopoll */ unsigned iopoll : 1; +/* have to be put into the iopoll list */ + unsigned iopoll_queue : 1;/* opcode specific path will handle ->async_data allocation if needed */ unsigned manual_alloc : 1;/* size of async data needed, if any */