1*7642e668SJens Axboe // SPDX-License-Identifier: GPL-2.0 2*7642e668SJens Axboe #ifndef IOU_TW_H 3*7642e668SJens Axboe #define IOU_TW_H 4*7642e668SJens Axboe 5*7642e668SJens Axboe #include <linux/sched.h> 6*7642e668SJens Axboe #include <linux/percpu-refcount.h> 7*7642e668SJens Axboe #include <linux/io_uring_types.h> 8*7642e668SJens Axboe 9*7642e668SJens Axboe #define IO_LOCAL_TW_DEFAULT_MAX 20 10*7642e668SJens Axboe 11*7642e668SJens Axboe /* 12*7642e668SJens Axboe * Terminate the request if either of these conditions are true: 13*7642e668SJens Axboe * 14*7642e668SJens Axboe * 1) It's being executed by the original task, but that task is marked 15*7642e668SJens Axboe * with PF_EXITING as it's exiting. 16*7642e668SJens Axboe * 2) PF_KTHREAD is set, in which case the invoker of the task_work is 17*7642e668SJens Axboe * our fallback task_work. 18*7642e668SJens Axboe * 3) The ring has been closed and is going away. 19*7642e668SJens Axboe */ 20*7642e668SJens Axboe static inline bool io_should_terminate_tw(struct io_ring_ctx *ctx) 21*7642e668SJens Axboe { 22*7642e668SJens Axboe return (current->flags & (PF_EXITING | PF_KTHREAD)) || percpu_ref_is_dying(&ctx->refs); 23*7642e668SJens Axboe } 24*7642e668SJens Axboe 25*7642e668SJens Axboe void io_req_task_work_add_remote(struct io_kiocb *req, unsigned flags); 26*7642e668SJens Axboe struct llist_node *io_handle_tw_list(struct llist_node *node, unsigned int *count, unsigned int max_entries); 27*7642e668SJens Axboe void tctx_task_work(struct callback_head *cb); 28*7642e668SJens Axboe int io_run_local_work(struct io_ring_ctx *ctx, int min_events, int max_events); 29*7642e668SJens Axboe int io_run_task_work_sig(struct io_ring_ctx *ctx); 30*7642e668SJens Axboe 31*7642e668SJens Axboe __cold void io_fallback_req_func(struct work_struct *work); 32*7642e668SJens Axboe __cold void io_move_task_work_from_local(struct io_ring_ctx *ctx); 33*7642e668SJens Axboe int io_run_local_work_locked(struct io_ring_ctx *ctx, int min_events); 34*7642e668SJens Axboe 35*7642e668SJens Axboe void io_req_local_work_add(struct io_kiocb *req, unsigned flags); 36*7642e668SJens Axboe void io_req_normal_work_add(struct io_kiocb *req); 37*7642e668SJens Axboe struct llist_node *tctx_task_work_run(struct io_uring_task *tctx, unsigned int max_entries, unsigned int *count); 38*7642e668SJens Axboe 39*7642e668SJens Axboe static inline void __io_req_task_work_add(struct io_kiocb *req, unsigned flags) 40*7642e668SJens Axboe { 41*7642e668SJens Axboe if (req->ctx->flags & IORING_SETUP_DEFER_TASKRUN) 42*7642e668SJens Axboe io_req_local_work_add(req, flags); 43*7642e668SJens Axboe else 44*7642e668SJens Axboe io_req_normal_work_add(req); 45*7642e668SJens Axboe } 46*7642e668SJens Axboe 47*7642e668SJens Axboe static inline void io_req_task_work_add(struct io_kiocb *req) 48*7642e668SJens Axboe { 49*7642e668SJens Axboe __io_req_task_work_add(req, 0); 50*7642e668SJens Axboe } 51*7642e668SJens Axboe 52*7642e668SJens Axboe static inline int io_run_task_work(void) 53*7642e668SJens Axboe { 54*7642e668SJens Axboe bool ret = false; 55*7642e668SJens Axboe 56*7642e668SJens Axboe /* 57*7642e668SJens Axboe * Always check-and-clear the task_work notification signal. With how 58*7642e668SJens Axboe * signaling works for task_work, we can find it set with nothing to 59*7642e668SJens Axboe * run. We need to clear it for that case, like get_signal() does. 60*7642e668SJens Axboe */ 61*7642e668SJens Axboe if (test_thread_flag(TIF_NOTIFY_SIGNAL)) 62*7642e668SJens Axboe clear_notify_signal(); 63*7642e668SJens Axboe /* 64*7642e668SJens Axboe * PF_IO_WORKER never returns to userspace, so check here if we have 65*7642e668SJens Axboe * notify work that needs processing. 66*7642e668SJens Axboe */ 67*7642e668SJens Axboe if (current->flags & PF_IO_WORKER) { 68*7642e668SJens Axboe if (test_thread_flag(TIF_NOTIFY_RESUME)) { 69*7642e668SJens Axboe __set_current_state(TASK_RUNNING); 70*7642e668SJens Axboe resume_user_mode_work(NULL); 71*7642e668SJens Axboe } 72*7642e668SJens Axboe if (current->io_uring) { 73*7642e668SJens Axboe unsigned int count = 0; 74*7642e668SJens Axboe 75*7642e668SJens Axboe __set_current_state(TASK_RUNNING); 76*7642e668SJens Axboe tctx_task_work_run(current->io_uring, UINT_MAX, &count); 77*7642e668SJens Axboe if (count) 78*7642e668SJens Axboe ret = true; 79*7642e668SJens Axboe } 80*7642e668SJens Axboe } 81*7642e668SJens Axboe if (task_work_pending(current)) { 82*7642e668SJens Axboe __set_current_state(TASK_RUNNING); 83*7642e668SJens Axboe task_work_run(); 84*7642e668SJens Axboe ret = true; 85*7642e668SJens Axboe } 86*7642e668SJens Axboe 87*7642e668SJens Axboe return ret; 88*7642e668SJens Axboe } 89*7642e668SJens Axboe 90*7642e668SJens Axboe static inline bool io_local_work_pending(struct io_ring_ctx *ctx) 91*7642e668SJens Axboe { 92*7642e668SJens Axboe return !llist_empty(&ctx->work_llist) || !llist_empty(&ctx->retry_llist); 93*7642e668SJens Axboe } 94*7642e668SJens Axboe 95*7642e668SJens Axboe static inline bool io_task_work_pending(struct io_ring_ctx *ctx) 96*7642e668SJens Axboe { 97*7642e668SJens Axboe return task_work_pending(current) || io_local_work_pending(ctx); 98*7642e668SJens Axboe } 99*7642e668SJens Axboe 100*7642e668SJens Axboe static inline void io_tw_lock(struct io_ring_ctx *ctx, io_tw_token_t tw) 101*7642e668SJens Axboe { 102*7642e668SJens Axboe lockdep_assert_held(&ctx->uring_lock); 103*7642e668SJens Axboe } 104*7642e668SJens Axboe 105*7642e668SJens Axboe static inline bool io_allowed_defer_tw_run(struct io_ring_ctx *ctx) 106*7642e668SJens Axboe { 107*7642e668SJens Axboe return likely(ctx->submitter_task == current); 108*7642e668SJens Axboe } 109*7642e668SJens Axboe 110*7642e668SJens Axboe static inline bool io_allowed_run_tw(struct io_ring_ctx *ctx) 111*7642e668SJens Axboe { 112*7642e668SJens Axboe return likely(!(ctx->flags & IORING_SETUP_DEFER_TASKRUN) || 113*7642e668SJens Axboe ctx->submitter_task == current); 114*7642e668SJens Axboe } 115*7642e668SJens Axboe 116*7642e668SJens Axboe #endif 117