diff options
author | Pavel Begunkov <asml.silence@gmail.com> | 2020-11-06 13:00:22 +0000 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2020-12-09 12:04:00 -0700 |
commit | 08d23634643c239ddae706758f54d3a8e0c24962 (patch) | |
tree | d7f78633e4de98947eb5fabfbf8d3b9c4f017b06 /fs/io_uring.c | |
parent | 06de5f5973c641c7ae033f133ecfaaf64fe633a6 (diff) | |
download | linux-08d23634643c239ddae706758f54d3a8e0c24962.tar.bz2 |
io_uring: add a {task,files} pair matching helper
Add io_match_task() that matches both task and files.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'fs/io_uring.c')
-rw-r--r-- | fs/io_uring.c | 48 |
1 files changed, 22 insertions, 26 deletions
diff --git a/fs/io_uring.c b/fs/io_uring.c index baff81313f54..35828af37065 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -1039,6 +1039,26 @@ static inline void io_clean_op(struct io_kiocb *req) __io_clean_op(req); } +static bool io_match_task(struct io_kiocb *head, + struct task_struct *task, + struct files_struct *files) +{ + struct io_kiocb *req; + + if (task && head->task != task) + return false; + if (!files) + return true; + + io_for_each_link(req, head) { + if ((req->flags & REQ_F_WORK_INITIALIZED) && + (req->work.flags & IO_WQ_WORK_FILES) && + req->work.identity->files == files) + return true; + } + return false; +} + static void io_sq_thread_drop_mm_files(void) { struct files_struct *files = current->files; @@ -1687,27 +1707,6 @@ static void io_cqring_mark_overflow(struct io_ring_ctx *ctx) } } -static inline bool __io_match_files(struct io_kiocb *req, - struct files_struct *files) -{ - return ((req->flags & REQ_F_WORK_INITIALIZED) && - (req->work.flags & IO_WQ_WORK_FILES)) && - req->work.identity->files == files; -} - -static bool io_match_files(struct io_kiocb *head, struct files_struct *files) -{ - struct io_kiocb *req; - - if (!files) - return true; - io_for_each_link(req, head) { - if (__io_match_files(req, files)) - return true; - } - return false; -} - /* Returns true if there are no backlogged entries after the flush */ static bool io_cqring_overflow_flush(struct io_ring_ctx *ctx, bool force, struct task_struct *tsk, @@ -1735,9 +1734,7 @@ static bool io_cqring_overflow_flush(struct io_ring_ctx *ctx, bool force, cqe = NULL; list_for_each_entry_safe(req, tmp, &ctx->cq_overflow_list, compl.list) { - if (tsk && req->task != tsk) - continue; - if (!io_match_files(req, files)) + if (!io_match_task(req, tsk, files)) continue; cqe = io_get_cqring(ctx); @@ -8787,8 +8784,7 @@ static void io_cancel_defer_files(struct io_ring_ctx *ctx, spin_lock_irq(&ctx->completion_lock); list_for_each_entry_reverse(de, &ctx->defer_list, list) { - if (io_task_match(de->req, task) && - io_match_files(de->req, files)) { + if (io_match_task(de->req, task, files)) { list_cut_position(&list, &ctx->defer_list, &de->list); break; } |