summaryrefslogtreecommitdiffstats
path: root/block/blk-ioc.c
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2021-12-09 07:31:30 +0100
committerJens Axboe <axboe@kernel.dk>2021-12-16 18:59:02 +0100
commit90b627f5426ce144cdd4ea585d1f7812359a1a6a (patch)
tree60b620a8ab9d1cacde912cb4354cfeffaaa24366 /block/blk-ioc.c
parentblock: open code create_task_io_context in set_task_ioprio (diff)
downloadlinux-90b627f5426ce144cdd4ea585d1f7812359a1a6a.tar.xz
linux-90b627f5426ce144cdd4ea585d1f7812359a1a6a.zip
block: fold create_task_io_context into ioc_find_get_icq
Fold create_task_io_context into the only remaining caller. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Jan Kara <jack@suse.cz> Link: https://lore.kernel.org/r/20211209063131.18537-11-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block/blk-ioc.c')
-rw-r--r--block/blk-ioc.c43
1 files changed, 12 insertions, 31 deletions
diff --git a/block/blk-ioc.c b/block/blk-ioc.c
index cff0e3bdae53..dc7fb064fd5f 100644
--- a/block/blk-ioc.c
+++ b/block/blk-ioc.c
@@ -238,36 +238,6 @@ static struct io_context *alloc_io_context(gfp_t gfp_flags, int node)
return ioc;
}
-static struct io_context *create_task_io_context(struct task_struct *task,
- gfp_t gfp_flags, int node)
-{
- struct io_context *ioc;
-
- ioc = alloc_io_context(gfp_flags, node);
- if (!ioc)
- return NULL;
-
- /*
- * Try to install. ioc shouldn't be installed if someone else
- * already did or @task, which isn't %current, is exiting. Note
- * that we need to allow ioc creation on exiting %current as exit
- * path may issue IOs from e.g. exit_files(). The exit path is
- * responsible for not issuing IO after exit_io_context().
- */
- task_lock(task);
- if (!task->io_context &&
- (task == current || !(task->flags & PF_EXITING)))
- task->io_context = ioc;
- else
- kmem_cache_free(iocontext_cachep, ioc);
-
- ioc = task->io_context;
- if (ioc)
- get_io_context(ioc);
- task_unlock(task);
- return ioc;
-}
-
int set_task_ioprio(struct task_struct *task, int ioprio)
{
int err;
@@ -426,9 +396,20 @@ struct io_cq *ioc_find_get_icq(struct request_queue *q)
struct io_cq *icq = NULL;
if (unlikely(!ioc)) {
- ioc = create_task_io_context(current, GFP_ATOMIC, q->node);
+ ioc = alloc_io_context(GFP_ATOMIC, q->node);
if (!ioc)
return NULL;
+
+ task_lock(current);
+ if (current->io_context) {
+ kmem_cache_free(iocontext_cachep, ioc);
+ ioc = current->io_context;
+ } else {
+ current->io_context = ioc;
+ }
+
+ get_io_context(ioc);
+ task_unlock(current);
} else {
get_io_context(ioc);