Message ID | 20240906095414.386388-1-zhanghui31@xiaomi.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v5] block: move non sync requests complete flow to softirq | expand |
On 9/6/24 18:54, ZhangHui wrote: > From: zhanghui <zhanghui31@xiaomi.com> > > 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@xiaomi.com> > --- > 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; > }
On 9/6/24 3:54 AM, ZhangHui wrote: > From: zhanghui <zhanghui31@xiaomi.com> > > 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. Didn't we already conclude that the fix for this would be on the f2fs side?
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)) { blk_mq_raise_softirq(rq); return true; }