io_uring: add tw add flags
authorPavel Begunkov <asml.silence@gmail.com>
Thu, 6 Apr 2023 13:20:10 +0000 (14:20 +0100)
committerJens Axboe <axboe@kernel.dk>
Thu, 6 Apr 2023 22:23:28 +0000 (16:23 -0600)
We pass 'allow_local' into io_req_task_work_add() but will need more
flags. Replace it with a flags bit field and name this allow_local
flag.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/4c0f01e7ef4e6feebfb199093cc995af7a19befa.1680782017.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/io_uring.c
io_uring/io_uring.h

index d4ac62d..6f175fe 100644 (file)
@@ -1324,12 +1324,13 @@ static void io_req_local_work_add(struct io_kiocb *req)
                wake_up_state(ctx->submitter_task, TASK_INTERRUPTIBLE);
 }
 
-void __io_req_task_work_add(struct io_kiocb *req, bool allow_local)
+void __io_req_task_work_add(struct io_kiocb *req, unsigned flags)
 {
        struct io_uring_task *tctx = req->task->io_uring;
        struct io_ring_ctx *ctx = req->ctx;
 
-       if (allow_local && ctx->flags & IORING_SETUP_DEFER_TASKRUN) {
+       if (!(flags & IOU_F_TWQ_FORCE_NORMAL) &&
+           (ctx->flags & IORING_SETUP_DEFER_TASKRUN)) {
                rcu_read_lock();
                io_req_local_work_add(req);
                rcu_read_unlock();
@@ -1359,7 +1360,7 @@ static void __cold io_move_task_work_from_local(struct io_ring_ctx *ctx)
                                                    io_task_work.node);
 
                node = node->next;
-               __io_req_task_work_add(req, false);
+               __io_req_task_work_add(req, IOU_F_TWQ_FORCE_NORMAL);
        }
 }
 
index 24d8196..cb4309a 100644 (file)
 #endif
 
 enum {
+       /* don't use deferred task_work */
+       IOU_F_TWQ_FORCE_NORMAL                  = 1,
+};
+
+enum {
        IOU_OK                  = 0,
        IOU_ISSUE_SKIP_COMPLETE = -EIOCBQUEUED,
 
@@ -48,7 +53,7 @@ static inline bool io_req_ffs_set(struct io_kiocb *req)
        return req->flags & REQ_F_FIXED_FILE;
 }
 
-void __io_req_task_work_add(struct io_kiocb *req, bool allow_local);
+void __io_req_task_work_add(struct io_kiocb *req, unsigned flags);
 bool io_is_uring_fops(struct file *file);
 bool io_alloc_async_data(struct io_kiocb *req);
 void io_req_task_queue(struct io_kiocb *req);
@@ -93,7 +98,7 @@ bool io_match_task_safe(struct io_kiocb *head, struct task_struct *task,
 
 static inline void io_req_task_work_add(struct io_kiocb *req)
 {
-       __io_req_task_work_add(req, true);
+       __io_req_task_work_add(req, 0);
 }
 
 #define io_for_each_link(pos, head) \