The loop worker thread only inherit the blkcg of original request, but does not inherit it's ioprio. So, when a task with the high ioprio but in root blkcg accesses the loop device, the worker thread handle this cmd with a normal ioprio. This results in the request of high ioprio task doesn't be prioritized. Signed-off-by: Yunlong Xing <yunlong.xing@xxxxxxxxxx> --- drivers/block/loop.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 28a95fd366fe..404ac113c71b 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -442,7 +442,6 @@ static int lo_rw_aio(struct loop_device *lo, struct loop_cmd *cmd, cmd->iocb.ki_filp = file; cmd->iocb.ki_complete = lo_rw_aio_complete; cmd->iocb.ki_flags = IOCB_DIRECT; - cmd->iocb.ki_ioprio = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_NONE, 0); if (rw == ITER_SOURCE) ret = call_write_iter(file, &cmd->iocb, &iter); @@ -1856,6 +1855,9 @@ static blk_status_t loop_queue_rq(struct blk_mq_hw_ctx *hctx, break; } + /* get request's ioprio */ + cmd->iocb.ki_ioprio = rq->ioprio; + /* always use the first bio's css */ cmd->blkcg_css = NULL; cmd->memcg_css = NULL; @@ -1886,12 +1888,18 @@ static void loop_handle_cmd(struct loop_cmd *cmd) int ret = 0; struct mem_cgroup *old_memcg = NULL; const bool use_aio = cmd->use_aio; + int ori_ioprio = 0; + int cmd_ioprio = cmd->iocb.ki_ioprio; if (write && (lo->lo_flags & LO_FLAGS_READ_ONLY)) { ret = -EIO; goto failed; } + ori_ioprio = get_current_ioprio(); + if (ori_ioprio != cmd_ioprio) + set_task_ioprio(current, cmd_ioprio); + if (cmd_blkcg_css) kthread_associate_blkcg(cmd_blkcg_css); if (cmd_memcg_css) @@ -1913,6 +1921,10 @@ static void loop_handle_cmd(struct loop_cmd *cmd) set_active_memcg(old_memcg); css_put(cmd_memcg_css); } + + if (ori_ioprio != cmd_ioprio) + set_task_ioprio(current, ori_ioprio); + failed: /* complete non-aio request */ if (!use_aio || ret) { -- 2.25.1