* [PATCH] block: move non sync requests complete flow to softirq
@ 2024-09-02 6:44 ZhangHui
2024-09-03 8:33 ` kernel test robot
0 siblings, 1 reply; 2+ messages in thread
From: ZhangHui @ 2024-09-02 6:44 UTC (permalink / raw)
To: axboe; +Cc: linux-block, linux-kernel, zhanghui31
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.
The CPU tick on a smartphone is only 4ms, which will undoubtedly affect
scheduling efficiency.
Let's fixed this issue by moved non sync request completion flow to
softirq, and keep the sync request completion in the top-half.
Signed-off-by: zhanghui <zhanghui31@xiaomi.com>
---
block/blk-mq.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/block/blk-mq.c b/block/blk-mq.c
index e3c3c0c21b55..06b232edff11 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -1193,6 +1193,8 @@ static void blk_mq_raise_softirq(struct request *rq)
bool blk_mq_complete_request_remote(struct request *rq)
{
+ const blk_opf_t is_sync = op_is_sync(rq->cmd_flags);
+
WRITE_ONCE(rq->state, MQ_RQ_COMPLETE);
/*
@@ -1210,7 +1212,7 @@ bool blk_mq_complete_request_remote(struct request *rq)
return true;
}
- if (rq->q->nr_hw_queues == 1) {
+ if ((rq->q->nr_hw_queues == 1) || !is_sync) {
blk_mq_raise_softirq(rq);
return true;
}
--
2.43.0
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] block: move non sync requests complete flow to softirq
2024-09-02 6:44 [PATCH] block: move non sync requests complete flow to softirq ZhangHui
@ 2024-09-03 8:33 ` kernel test robot
0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2024-09-03 8:33 UTC (permalink / raw)
To: ZhangHui, axboe; +Cc: oe-kbuild-all, linux-block, linux-kernel, zhanghui31
Hi ZhangHui,
kernel test robot noticed the following build warnings:
[auto build test WARNING on axboe-block/for-next]
[also build test WARNING on linus/master v6.11-rc6 next-20240902]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/ZhangHui/block-move-non-sync-requests-complete-flow-to-softirq/20240902-144744
base: https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next
patch link: https://lore.kernel.org/r/20240902064409.25637-1-zhanghui31%40xiaomi.com
patch subject: [PATCH] block: move non sync requests complete flow to softirq
config: x86_64-randconfig-122-20240903 (https://download.01.org/0day-ci/archive/20240903/202409031507.wUCw4k8n-lkp@intel.com/config)
compiler: clang version 18.1.5 (https://github.com/llvm/llvm-project 617a15a9eac96088ae5e9134248d8236e34b91b1)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240903/202409031507.wUCw4k8n-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202409031507.wUCw4k8n-lkp@intel.com/
sparse warnings: (new ones prefixed by >>)
>> block/blk-mq.c:1196:45: sparse: sparse: incorrect type in initializer (different base types) @@ expected restricted blk_opf_t const [usertype] is_sync @@ got bool @@
block/blk-mq.c:1196:45: sparse: expected restricted blk_opf_t const [usertype] is_sync
block/blk-mq.c:1196:45: sparse: got bool
block/blk-mq.c: note: in included file (through include/linux/module.h):
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
vim +1196 block/blk-mq.c
1193
1194 bool blk_mq_complete_request_remote(struct request *rq)
1195 {
> 1196 const blk_opf_t is_sync = op_is_sync(rq->cmd_flags);
1197
1198 WRITE_ONCE(rq->state, MQ_RQ_COMPLETE);
1199
1200 /*
1201 * For request which hctx has only one ctx mapping,
1202 * or a polled request, always complete locally,
1203 * it's pointless to redirect the completion.
1204 */
1205 if ((rq->mq_hctx->nr_ctx == 1 &&
1206 rq->mq_ctx->cpu == raw_smp_processor_id()) ||
1207 rq->cmd_flags & REQ_POLLED)
1208 return false;
1209
1210 if (blk_mq_complete_need_ipi(rq)) {
1211 blk_mq_complete_send_ipi(rq);
1212 return true;
1213 }
1214
1215 if ((rq->q->nr_hw_queues == 1) || !is_sync) {
1216 blk_mq_raise_softirq(rq);
1217 return true;
1218 }
1219 return false;
1220 }
1221 EXPORT_SYMBOL_GPL(blk_mq_complete_request_remote);
1222
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2024-09-03 8:34 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-09-02 6:44 [PATCH] block: move non sync requests complete flow to softirq ZhangHui
2024-09-03 8:33 ` kernel test robot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®