On 9/6/24 18:54, ZhangHui wrote: > From: zhanghui <zhanghui31@xxxxxxxxxx> > > Currently, for a controller that supports multiple queues, like UFS4.0, > the mq_ops->complete is executed in the interrupt top-half. Therefore, > the file system's end io is executed during the request completion process, > such as f2fs_write_end_io on smartphone. > > However, we found that the execution time of the file system end io > is strongly related to the size of the bio and the processing speed > of the CPU. Because the file system's end io will traverse every page > in bio, this is a very time-consuming operation. > > We measured that the 80M bio write operation on the little CPU will > cause the execution time of the top-half to be greater than 100ms, > which will undoubtedly affect interrupt response latency. > > Let's fix this issue by moving non sync requests completion to softirq > context, and keeping sync requests completion in the IRQ top-half context. > > Signed-off-by: zhanghui <zhanghui31@xxxxxxxxxx> > --- > Changes in v5: > - modify the commit log > - remove unnecessary variable and add comment > > Changes in v4: > - fix commit log from "scheduling efficiency" to "interrupt response latency" > > Changes in v3: > - modify op_is_sync to rq_is_sync > > Changes in v2: > - fix build warning > --- > block/blk-mq.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/block/blk-mq.c b/block/blk-mq.c > index e3c3c0c21b55..45e4d255ea3b 100644 > --- a/block/blk-mq.c > +++ b/block/blk-mq.c > @@ -1210,7 +1210,11 @@ bool blk_mq_complete_request_remote(struct request *rq) > return true; > } > > - if (rq->q->nr_hw_queues == 1) { > + /* > + * To reduce the execution time in the IRQ top-half, > + * move non-sync request completions to softirq context. > + */ > + if ((rq->q->nr_hw_queues == 1) || !rq_is_sync(rq)) { I did mention that you do not need the inner parenthesis here... > blk_mq_raise_softirq(rq); > return true; > } -- Damien Le Moal Western Digital Research