diff mbox series

[for-next,2/2] io_uring: optimise ltimeout for inline execution

Message ID 8bf69c2a4beec14c565c85c86edb871ca8b8bcc8.1701390926.git.asml.silence@gmail.com (mailing list archive)
State New
Headers show
Series inline execution ltimeout optimisation | expand

Commit Message

Pavel Begunkov Dec. 1, 2023, 12:38 a.m. UTC
At one point in time we had an optimisation that would not spin up a
linked timeout timer when the master request successfully completes
inline (during the first nowait execution attempt). We somehow lost it,
so this patch restores it back.

Note, that it's fine using io_arm_ltimeout() after the io_issue_sqe()
completes the request because of delayed completion, but that that adds
unwanted overhead.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
 io_uring/io_uring.c | 19 +++++++++----------
 1 file changed, 9 insertions(+), 10 deletions(-)

Comments

Pavel Begunkov Dec. 1, 2023, 7:03 p.m. UTC | #1
On 12/1/23 00:38, Pavel Begunkov wrote:
> At one point in time we had an optimisation that would not spin up a
> linked timeout timer when the master request successfully completes
> inline (during the first nowait execution attempt). We somehow lost it,
> so this patch restores it back.
> 
> Note, that it's fine using io_arm_ltimeout() after the io_issue_sqe()
> completes the request because of delayed completion, but that that adds
> unwanted overhead.

Let's add:

Reported-by: Christian Mazakas <christian.mazakas@gmail.com>

> 
> Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
> ---
>   io_uring/io_uring.c | 19 +++++++++----------
>   1 file changed, 9 insertions(+), 10 deletions(-)
> 
> diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c
> index 21e646ef9654..6212f81ed887 100644
> --- a/io_uring/io_uring.c
> +++ b/io_uring/io_uring.c
> @@ -1900,14 +1900,15 @@ static int io_issue_sqe(struct io_kiocb *req, unsigned int issue_flags)
>   		return 0;
>   	}
>   
> -	if (ret != IOU_ISSUE_SKIP_COMPLETE)
> -		return ret;
> -
> -	/* If the op doesn't have a file, we're not polling for it */
> -	if ((req->ctx->flags & IORING_SETUP_IOPOLL) && def->iopoll_queue)
> -		io_iopoll_req_issued(req, issue_flags);
> +	if (ret == IOU_ISSUE_SKIP_COMPLETE) {
> +		ret = 0;
> +		io_arm_ltimeout(req);
>   
> -	return 0;
> +		/* If the op doesn't have a file, we're not polling for it */
> +		if ((req->ctx->flags & IORING_SETUP_IOPOLL) && def->iopoll_queue)
> +			io_iopoll_req_issued(req, issue_flags);
> +	}
> +	return ret;
>   }
>   
>   int io_poll_issue(struct io_kiocb *req, struct io_tw_state *ts)
> @@ -2078,9 +2079,7 @@ static inline void io_queue_sqe(struct io_kiocb *req)
>   	 * We async punt it if the file wasn't marked NOWAIT, or if the file
>   	 * doesn't support non-blocking read/write attempts
>   	 */
> -	if (likely(!ret))
> -		io_arm_ltimeout(req);
> -	else
> +	if (unlikely(ret))
>   		io_queue_async(req, ret);
>   }
>
diff mbox series

Patch

diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c
index 21e646ef9654..6212f81ed887 100644
--- a/io_uring/io_uring.c
+++ b/io_uring/io_uring.c
@@ -1900,14 +1900,15 @@  static int io_issue_sqe(struct io_kiocb *req, unsigned int issue_flags)
 		return 0;
 	}
 
-	if (ret != IOU_ISSUE_SKIP_COMPLETE)
-		return ret;
-
-	/* If the op doesn't have a file, we're not polling for it */
-	if ((req->ctx->flags & IORING_SETUP_IOPOLL) && def->iopoll_queue)
-		io_iopoll_req_issued(req, issue_flags);
+	if (ret == IOU_ISSUE_SKIP_COMPLETE) {
+		ret = 0;
+		io_arm_ltimeout(req);
 
-	return 0;
+		/* If the op doesn't have a file, we're not polling for it */
+		if ((req->ctx->flags & IORING_SETUP_IOPOLL) && def->iopoll_queue)
+			io_iopoll_req_issued(req, issue_flags);
+	}
+	return ret;
 }
 
 int io_poll_issue(struct io_kiocb *req, struct io_tw_state *ts)
@@ -2078,9 +2079,7 @@  static inline void io_queue_sqe(struct io_kiocb *req)
 	 * We async punt it if the file wasn't marked NOWAIT, or if the file
 	 * doesn't support non-blocking read/write attempts
 	 */
-	if (likely(!ret))
-		io_arm_ltimeout(req);
-	else
+	if (unlikely(ret))
 		io_queue_async(req, ret);
 }