diff options
author | Christoph Hellwig <hch@lst.de> | 2021-12-09 07:31:29 +0100 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2021-12-16 18:59:02 +0100 |
commit | 5fc11eebb4a98df5324a4de369bb5ab7f0007ff7 (patch) | |
tree | 1b14983549b36b9504f4a99c0755e7f4e62cdeb0 /block/blk-ioc.c | |
parent | block: fold get_task_io_context into set_task_ioprio (diff) | |
download | linux-5fc11eebb4a98df5324a4de369bb5ab7f0007ff7.tar.xz linux-5fc11eebb4a98df5324a4de369bb5ab7f0007ff7.zip |
block: open code create_task_io_context in set_task_ioprio
The flow in set_task_ioprio can be simplified by simply open coding
create_task_io_context, which removes a refcount roundtrip on the I/O
context.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Jan Kara <jack@suse.cz>
Link: https://lore.kernel.org/r/20211209063131.18537-10-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block/blk-ioc.c')
-rw-r--r-- | block/blk-ioc.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/block/blk-ioc.c b/block/blk-ioc.c index 1ba7cfedca2d..cff0e3bdae53 100644 --- a/block/blk-ioc.c +++ b/block/blk-ioc.c @@ -291,12 +291,18 @@ int set_task_ioprio(struct task_struct *task, int ioprio) struct io_context *ioc; task_unlock(task); - ioc = create_task_io_context(task, GFP_ATOMIC, NUMA_NO_NODE); - if (ioc) { - ioc->ioprio = ioprio; - put_io_context(ioc); + + ioc = alloc_io_context(GFP_ATOMIC, NUMA_NO_NODE); + if (!ioc) + return -ENOMEM; + + task_lock(task); + if (task->io_context || (task->flags & PF_EXITING)) { + kmem_cache_free(iocontext_cachep, ioc); + ioc = task->io_context; + } else { + task->io_context = ioc; } - return 0; } task->io_context->ioprio = ioprio; task_unlock(task); |