diff mbox series

block: move non sync requests complete flow to softirq

Message ID 20240902064409.25637-1-zhanghui31@xiaomi.com (mailing list archive)
State New, archived
Headers show
Series block: move non sync requests complete flow to softirq | expand

Commit Message

章辉 Sept. 2, 2024, 6:44 a.m. UTC
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(-)

Comments

kernel test robot Sept. 3, 2024, 8:33 a.m. UTC | #1
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
diff mbox series

Patch

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;
 	}