Re: [PATCH] loop: inherit the ioprio in loop woker thread

From: yunlong xing
Date: Fri May 24 2024 - 01:26:41 EST


Jens Axboe <axboe@xxxxxxxxx> 于2024年5月23日周四 22:58写道:
>
> On 5/23/24 8:52 AM, yunlong xing wrote:
> > Jens Axboe <axboe@xxxxxxxxx> ?2024?5?23??? 21:04???
> >>
> >> On 5/23/24 12:04 AM, yunlong xing wrote:
> >>> Bart Van Assche <bvanassche@xxxxxxx> ?2024?5?23??? 02:12???
> >>>>
> >>>> On 5/22/24 10:57, Jens Axboe wrote:
> >>>>> On 5/22/24 11:38 AM, Bart Van Assche wrote:
> >>>>>> On 5/22/24 00:48, Yunlong Xing wrote:
> >>>>>>> @@ -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) {
> >>>>>>
> >>>>>> Does adding this call in the hot path have a measurable performance impact?
> >>>>>
> >>>>> It's loop, I would not be concerned with overhead. But it does look pretty
> >>>>> bogus to modify the task ioprio from here.
> >>>>
> >>>> Hi Jens,
> >>>>
> >>>> Maybe Yunlong uses that call to pass the I/O priority to the I/O submitter?
> >>>>
> >>>> I think that it is easy to pass the I/O priority to the kiocb submitted by
> >>>> lo_rw_aio() without calling set_task_ioprio().
> >>>>
> >>>> lo_read_simple() and lo_write_simple() however call vfs_iter_read() /
> >>>> vfs_iter_write(). This results in a call of do_iter_readv_writev() and
> >>>> init_sync_kiocb(). The latter function calls get_current_ioprio(). This is
> >>>> probably why the set_task_ioprio() call has been added?
> >>>
> >>> Yeah that's why I call set_task_ioprio. I want to the loop kwoker
> >>> task?submit I/O to the real disk device?can pass the iopriority of the
> >>> loop device request? both lo_rw_aio() and
> >>> lo_read_simple()/lo_write_simple().
> >>
> >> And that's a totally backwards and suboptimal way to do it. The task
> >> priority is only used as a last resort lower down, if the IO itself
> >> hasn't been appropriately marked.
> >>
> >> Like I said, it's back to the drawing board on this patch, there's no
> >> way it's acceptable in its current form.
> >>
> >> --
> >> Jens Axboe
> >>
> > Thanks for your advice. So, you can't accept pass the ioprio by
> > set_task_ioprio?
>
> Not sure how many times I'd have to state that, no.
Of course, I understand what you mean. I would like to ask if you only
disagree with this part. Sorry for missing a word "just".

Back to the patch, I couldn't find a better way to pass the ioprio in the
lo_read/write_simple(). Do you have some suggestions or ideas?
>
> > If only the method of lo_rw_aio() counld you accept? I don't want to
> > submit this part of the modifications separately. I just want to know,
> > this is ok to you or not?
>
> Inheriting the kiocb ioprio from the request is the right approach, so
> yeah that part is fine.
>
> --
> Jens Axboe
>