summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2022-05-24 21:45:38 +0300
committerJens Axboe <axboe@kernel.dk>2022-07-25 03:39:11 +0300
commitde23077eda61f549dbdadc4b6aa95f6e7b251552 (patch)
tree173b65d0a0dc8e21c44727ca433d495f20d1e318
parente27f928ee1cb068ac6c18ea244351a4c90a61139 (diff)
downloadlinux-de23077eda61f549dbdadc4b6aa95f6e7b251552.tar.xz
io_uring: set completion results upfront
Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r--io_uring/io_uring.c21
-rw-r--r--io_uring/io_uring.h13
2 files changed, 22 insertions, 12 deletions
diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c
index ff7886c35490..92e51bbb769c 100644
--- a/io_uring/io_uring.c
+++ b/io_uring/io_uring.c
@@ -91,6 +91,7 @@
#include "io-wq.h"
#include "io_uring_types.h"
+#include "io_uring.h"
#define IORING_MAX_ENTRIES 32768
#define IORING_MAX_CQ_ENTRIES (2 * IORING_MAX_ENTRIES)
@@ -1876,21 +1877,15 @@ static void io_req_complete_post(struct io_kiocb *req, s32 res, u32 cflags)
io_cqring_ev_posted(ctx);
}
-static inline void io_req_complete_state(struct io_kiocb *req, s32 res,
- u32 cflags)
-{
- req->cqe.res = res;
- req->cqe.flags = cflags;
- req->flags |= REQ_F_COMPLETE_INLINE;
-}
-
static inline void __io_req_complete(struct io_kiocb *req, unsigned issue_flags,
s32 res, u32 cflags)
{
- if (issue_flags & IO_URING_F_COMPLETE_DEFER)
- io_req_complete_state(req, res, cflags);
- else
+ if (issue_flags & IO_URING_F_COMPLETE_DEFER) {
+ io_req_set_res(req, res, cflags);
+ req->flags |= REQ_F_COMPLETE_INLINE;
+ } else {
io_req_complete_post(req, res, cflags);
+ }
}
static inline void io_req_complete(struct io_kiocb *req, s32 res)
@@ -2749,7 +2744,8 @@ static inline void io_req_task_complete(struct io_kiocb *req, bool *locked)
int res = req->cqe.res;
if (*locked) {
- io_req_complete_state(req, res, io_put_kbuf(req, 0));
+ io_req_set_res(req, res, io_put_kbuf(req, 0));
+ req->flags |= REQ_F_COMPLETE_INLINE;
io_req_add_compl_list(req);
} else {
io_req_complete_post(req, res,
@@ -4394,6 +4390,7 @@ void io_uring_cmd_done(struct io_uring_cmd *ioucmd, ssize_t ret, ssize_t res2)
if (ret < 0)
req_set_fail(req);
+ io_req_set_res(req, 0, ret);
if (req->ctx->flags & IORING_SETUP_CQE32)
io_req_set_cqe32_extra(req, res2, 0);
io_req_complete(req, ret);
diff --git a/io_uring/io_uring.h b/io_uring/io_uring.h
new file mode 100644
index 000000000000..522e65219757
--- /dev/null
+++ b/io_uring/io_uring.h
@@ -0,0 +1,13 @@
+#ifndef IOU_CORE_H
+#define IOU_CORE_H
+
+#include <linux/errno.h>
+#include "io_uring_types.h"
+
+static inline void io_req_set_res(struct io_kiocb *req, s32 res, u32 cflags)
+{
+ req->cqe.res = res;
+ req->cqe.flags = cflags;
+}
+
+#endif