From: Pavel Begunkov <[email protected]>
To: Jens Axboe <[email protected]>, [email protected]
Subject: [PATCH 2/2] io_uring: simplify SQPOLL cancellations
Date: Sun, 25 Apr 2021 23:34:46 +0100 [thread overview]
Message-ID: <3cd7f166b9c326a2c932b70e71a655b03257b366.1619389911.git.asml.silence@gmail.com> (raw)
In-Reply-To: <[email protected]>
All sqpoll rings (even sharing sqpoll task) are currently dead bound
to the task that created them, iow when owner task dies it kills all
its SQPOLL rings and their inflight requests via task_work infra. It's
neither the nicist way nor the most convenient as adds extra
locking/waiting and dependencies.
Leave it alone and rely on SIGKILL being delivered on its thread group
exit, so there are only two cases left:
1) thread group is dying, so sqpoll task gets a signal and exit itself
cancelling all requests.
2) an sqpoll ring is dying. Because refs_kill() is called the sqpoll not
going to submit any new request, and that's what we need. And
io_ring_exit_work() will do all the cancellation itself before
actually killing ctx, so sqpoll doesn't need to worry about it.
Signed-off-by: Pavel Begunkov <[email protected]>
---
fs/io_uring.c | 45 +++------------------------------------------
1 file changed, 3 insertions(+), 42 deletions(-)
diff --git a/fs/io_uring.c b/fs/io_uring.c
index 640a4bc77aa6..1cdc9b7c5c8c 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -9020,41 +9020,6 @@ static s64 tctx_inflight(struct io_uring_task *tctx, bool tracked)
return percpu_counter_sum(&tctx->inflight);
}
-static void io_sqpoll_cancel_cb(struct callback_head *cb)
-{
- struct io_tctx_exit *work = container_of(cb, struct io_tctx_exit, task_work);
- struct io_sq_data *sqd = work->ctx->sq_data;
-
- if (sqd->thread)
- io_uring_cancel_sqpoll(sqd);
- list_del_init(&work->ctx->sqd_list);
- io_sqd_update_thread_idle(sqd);
- complete(&work->completion);
-}
-
-static void io_sqpoll_cancel_sync(struct io_ring_ctx *ctx)
-{
- struct io_sq_data *sqd = ctx->sq_data;
- struct io_tctx_exit work = { .ctx = ctx, };
- struct task_struct *task;
-
- io_sq_thread_park(sqd);
- task = sqd->thread;
- if (task) {
- init_completion(&work.completion);
- init_task_work(&work.task_work, io_sqpoll_cancel_cb);
- io_task_work_add_head(&sqd->park_task_work, &work.task_work);
- wake_up_process(task);
- } else {
- list_del_init(&ctx->sqd_list);
- io_sqd_update_thread_idle(sqd);
- }
- io_sq_thread_unpark(sqd);
-
- if (task)
- wait_for_completion(&work.completion);
-}
-
static void io_uring_try_cancel(struct files_struct *files)
{
struct io_uring_task *tctx = current->io_uring;
@@ -9064,11 +9029,9 @@ static void io_uring_try_cancel(struct files_struct *files)
xa_for_each(&tctx->xa, index, node) {
struct io_ring_ctx *ctx = node->ctx;
- if (ctx->sq_data) {
- io_sqpoll_cancel_sync(ctx);
- continue;
- }
- io_uring_try_cancel_requests(ctx, current, files);
+ /* sqpoll task will cancel all its requests */
+ if (!ctx->sq_data)
+ io_uring_try_cancel_requests(ctx, current, files);
}
}
@@ -9116,8 +9079,6 @@ void __io_uring_cancel(struct files_struct *files)
/* make sure overflow events are dropped */
atomic_inc(&tctx->in_idle);
- io_uring_try_cancel(files);
-
do {
/* read completions before cancelations */
inflight = tctx_inflight(tctx, !!files);
--
2.31.1
next prev parent reply other threads:[~2021-04-25 22:35 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-25 22:34 [PATCH 0/2] sqpoll cancellation Pavel Begunkov
2021-04-25 22:34 ` [PATCH 1/2] io_uring: fix work_exit sqpoll cancellations Pavel Begunkov
2021-04-25 22:34 ` Pavel Begunkov [this message]
2021-04-26 12:59 ` [PATCH 0/2] sqpoll cancellation Jens Axboe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3cd7f166b9c326a2c932b70e71a655b03257b366.1619389911.git.asml.silence@gmail.com \
[email protected] \
[email protected] \
[email protected] \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox