mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-15 11:47:47 +00:00
Merge branch 'for-6.14/io_uring' into for-next
* for-6.14/io_uring: io_uring: simplify the SQPOLL thread check when cancelling requests
This commit is contained in:
commit
2b122597b7
@ -143,7 +143,8 @@ struct io_defer_entry {
|
|||||||
|
|
||||||
static bool io_uring_try_cancel_requests(struct io_ring_ctx *ctx,
|
static bool io_uring_try_cancel_requests(struct io_ring_ctx *ctx,
|
||||||
struct io_uring_task *tctx,
|
struct io_uring_task *tctx,
|
||||||
bool cancel_all);
|
bool cancel_all,
|
||||||
|
bool is_sqpoll_thread);
|
||||||
|
|
||||||
static void io_queue_sqe(struct io_kiocb *req);
|
static void io_queue_sqe(struct io_kiocb *req);
|
||||||
|
|
||||||
@ -2865,7 +2866,8 @@ static __cold void io_ring_exit_work(struct work_struct *work)
|
|||||||
if (ctx->flags & IORING_SETUP_DEFER_TASKRUN)
|
if (ctx->flags & IORING_SETUP_DEFER_TASKRUN)
|
||||||
io_move_task_work_from_local(ctx);
|
io_move_task_work_from_local(ctx);
|
||||||
|
|
||||||
while (io_uring_try_cancel_requests(ctx, NULL, true))
|
/* The SQPOLL thread never reaches this path */
|
||||||
|
while (io_uring_try_cancel_requests(ctx, NULL, true, false))
|
||||||
cond_resched();
|
cond_resched();
|
||||||
|
|
||||||
if (ctx->sq_data) {
|
if (ctx->sq_data) {
|
||||||
@ -3033,7 +3035,8 @@ static __cold bool io_uring_try_cancel_iowq(struct io_ring_ctx *ctx)
|
|||||||
|
|
||||||
static __cold bool io_uring_try_cancel_requests(struct io_ring_ctx *ctx,
|
static __cold bool io_uring_try_cancel_requests(struct io_ring_ctx *ctx,
|
||||||
struct io_uring_task *tctx,
|
struct io_uring_task *tctx,
|
||||||
bool cancel_all)
|
bool cancel_all,
|
||||||
|
bool is_sqpoll_thread)
|
||||||
{
|
{
|
||||||
struct io_task_cancel cancel = { .tctx = tctx, .all = cancel_all, };
|
struct io_task_cancel cancel = { .tctx = tctx, .all = cancel_all, };
|
||||||
enum io_wq_cancel cret;
|
enum io_wq_cancel cret;
|
||||||
@ -3063,7 +3066,7 @@ static __cold bool io_uring_try_cancel_requests(struct io_ring_ctx *ctx,
|
|||||||
|
|
||||||
/* SQPOLL thread does its own polling */
|
/* SQPOLL thread does its own polling */
|
||||||
if ((!(ctx->flags & IORING_SETUP_SQPOLL) && cancel_all) ||
|
if ((!(ctx->flags & IORING_SETUP_SQPOLL) && cancel_all) ||
|
||||||
(ctx->sq_data && ctx->sq_data->thread == current)) {
|
is_sqpoll_thread) {
|
||||||
while (!wq_list_empty(&ctx->iopoll_list)) {
|
while (!wq_list_empty(&ctx->iopoll_list)) {
|
||||||
io_iopoll_try_reap_events(ctx);
|
io_iopoll_try_reap_events(ctx);
|
||||||
ret = true;
|
ret = true;
|
||||||
@ -3136,13 +3139,15 @@ __cold void io_uring_cancel_generic(bool cancel_all, struct io_sq_data *sqd)
|
|||||||
continue;
|
continue;
|
||||||
loop |= io_uring_try_cancel_requests(node->ctx,
|
loop |= io_uring_try_cancel_requests(node->ctx,
|
||||||
current->io_uring,
|
current->io_uring,
|
||||||
cancel_all);
|
cancel_all,
|
||||||
|
false);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
list_for_each_entry(ctx, &sqd->ctx_list, sqd_list)
|
list_for_each_entry(ctx, &sqd->ctx_list, sqd_list)
|
||||||
loop |= io_uring_try_cancel_requests(ctx,
|
loop |= io_uring_try_cancel_requests(ctx,
|
||||||
current->io_uring,
|
current->io_uring,
|
||||||
cancel_all);
|
cancel_all,
|
||||||
|
true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (loop) {
|
if (loop) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user