Thread (6 messages) 6 messages, 2 authors, 2021-08-23

Re: [PATCH 2/2] io_uring: fix failed linkchain code logic

From: Pavel Begunkov <asml.silence@gmail.com>
Date: 2021-08-23 17:13:34

On 8/23/21 12:02 PM, Pavel Begunkov wrote:
On 8/23/21 4:25 AM, Hao Xu wrote:
quoted
Given a linkchain like this:
req0(link_flag)-->req1(link_flag)-->...-->reqn(no link_flag)

There is a problem:
 - if some intermediate linked req like req1 's submittion fails, reqs
   after it won't be cancelled.

   - sqpoll disabled: maybe it's ok since users can get the error info
     of req1 and stop submitting the following sqes.

   - sqpoll enabled: definitely a problem, the following sqes will be
     submitted in the next round.

The solution is to refactor the code logic to:
 - if a linked req's submittion fails, just mark it and the head(if it
   exists) as REQ_F_FAIL. Leverage req->result to indicate whether it
   is failed or cancelled.
 - submit or fail the whole chain when we come to the end of it.
This looks good to me, a couple of comments below.

quoted
Signed-off-by: Hao Xu <redacted>
---
 fs/io_uring.c | 61 +++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 45 insertions(+), 16 deletions(-)
diff --git a/fs/io_uring.c b/fs/io_uring.c
index 44b1b2b58e6a..9ae8f2a5c584 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -1776,8 +1776,6 @@ static void io_preinit_req(struct io_kiocb *req, struct io_ring_ctx *ctx)
 	req->ctx = ctx;
 	req->link = NULL;
 	req->async_data = NULL;
-	/* not necessary, but safer to zero */
-	req->result = 0;
Please leave it. I'm afraid of leaking stack to userspace because
                                         ^^^^^
Don't know why I called it "stack", just kernel memory/data
->result juggling looks prone to errors. And preinit is pretty cold
anyway.
-- 
Pavel Begunkov
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help