Commit dd432ea5 authored by Pavel Begunkov's avatar Pavel Begunkov Committed by Jens Axboe

io_uring: mainstream sqpoll task_work running

task_works are widely used, so place io_run_task_work() directly into
the main path of io_sq_thread(), and remove it from other places where
it's not needed anymore.
Signed-off-by: default avatarPavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/24eb5e35d519c590d3dffbd694b4c61a5fe49029.1624739600.git.asml.silence@gmail.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent b2d9c3da
...@@ -6868,7 +6868,6 @@ static bool io_sqd_handle_event(struct io_sq_data *sqd) ...@@ -6868,7 +6868,6 @@ static bool io_sqd_handle_event(struct io_sq_data *sqd)
cond_resched(); cond_resched();
mutex_lock(&sqd->lock); mutex_lock(&sqd->lock);
} }
io_run_task_work();
return did_sig || test_bit(IO_SQ_THREAD_SHOULD_STOP, &sqd->state); return did_sig || test_bit(IO_SQ_THREAD_SHOULD_STOP, &sqd->state);
} }
...@@ -6897,7 +6896,6 @@ static int io_sq_thread(void *data) ...@@ -6897,7 +6896,6 @@ static int io_sq_thread(void *data)
if (io_sqd_handle_event(sqd)) if (io_sqd_handle_event(sqd))
break; break;
timeout = jiffies + sqd->sq_thread_idle; timeout = jiffies + sqd->sq_thread_idle;
continue;
} }
cap_entries = !list_is_singular(&sqd->ctx_list); cap_entries = !list_is_singular(&sqd->ctx_list);
...@@ -6907,9 +6905,10 @@ static int io_sq_thread(void *data) ...@@ -6907,9 +6905,10 @@ static int io_sq_thread(void *data)
if (!sqt_spin && (ret > 0 || !list_empty(&ctx->iopoll_list))) if (!sqt_spin && (ret > 0 || !list_empty(&ctx->iopoll_list)))
sqt_spin = true; sqt_spin = true;
} }
if (io_run_task_work())
sqt_spin = true;
if (sqt_spin || !time_after(jiffies, timeout)) { if (sqt_spin || !time_after(jiffies, timeout)) {
io_run_task_work();
cond_resched(); cond_resched();
if (sqt_spin) if (sqt_spin)
timeout = jiffies + sqd->sq_thread_idle; timeout = jiffies + sqd->sq_thread_idle;
...@@ -6917,7 +6916,7 @@ static int io_sq_thread(void *data) ...@@ -6917,7 +6916,7 @@ static int io_sq_thread(void *data)
} }
prepare_to_wait(&sqd->wait, &wait, TASK_INTERRUPTIBLE); prepare_to_wait(&sqd->wait, &wait, TASK_INTERRUPTIBLE);
if (!io_sqd_events_pending(sqd) && !io_run_task_work()) { if (!io_sqd_events_pending(sqd) && !current->task_works) {
bool needs_sched = true; bool needs_sched = true;
list_for_each_entry(ctx, &sqd->ctx_list, sqd_list) { list_for_each_entry(ctx, &sqd->ctx_list, sqd_list) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment