* [PATCH 1/2] scsi: add scsi_done_direct() helper
@ 2022-02-08 6:37 Xiaoguang Wang
2022-02-08 6:37 ` [PATCH 2/2] scsi: target: tcm_loop: use scsi_done_direct() Xiaoguang Wang
2022-02-11 21:49 ` [PATCH 1/2] scsi: add scsi_done_direct() helper Martin K. Petersen
0 siblings, 2 replies; 3+ messages in thread
From: Xiaoguang Wang @ 2022-02-08 6:37 UTC (permalink / raw)
To: linux-scsi, target-devel; +Cc: martin.petersen, bostroesser, kanie
For scsi commands that are known to be completed in non-interrupt
context, scsi_done_direct() calling blk_mq_complete_request_direct()
can be used to completes commands directly instead deferring it
to softirq, which can give throughput improvement.
Signed-off-by: Xiaoguang Wang <xiaoguang.wang@linux.alibaba.com>
---
drivers/scsi/scsi_lib.c | 32 +++++++++++++++++++++++++++-----
include/scsi/scsi_cmnd.h | 1 +
2 files changed, 28 insertions(+), 5 deletions(-)
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 0a70aa763a96..c37879f46eaf 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -1625,26 +1625,48 @@ static blk_status_t scsi_prepare_cmd(struct request *req)
return scsi_cmd_to_driver(cmd)->init_command(cmd);
}
-void scsi_done(struct scsi_cmnd *cmd)
+static bool __scsi_done(struct scsi_cmnd *cmd)
{
switch (cmd->submitter) {
case SUBMITTED_BY_BLOCK_LAYER:
- break;
+ return false;
case SUBMITTED_BY_SCSI_ERROR_HANDLER:
- return scsi_eh_done(cmd);
+ scsi_eh_done(cmd);
+ return true;
case SUBMITTED_BY_SCSI_RESET_IOCTL:
- return;
+ return true;
}
if (unlikely(blk_should_fake_timeout(scsi_cmd_to_rq(cmd)->q)))
- return;
+ return true;
if (unlikely(test_and_set_bit(SCMD_STATE_COMPLETE, &cmd->state)))
+ return true;
+ return false;
+}
+
+void scsi_done(struct scsi_cmnd *cmd)
+{
+ if (__scsi_done(cmd))
return;
+
trace_scsi_dispatch_cmd_done(cmd);
blk_mq_complete_request(scsi_cmd_to_rq(cmd));
}
EXPORT_SYMBOL(scsi_done);
+/* Complete cmds directly, useful in preemptible instead of an interrupt. */
+void scsi_done_direct(struct scsi_cmnd *cmd)
+{
+ struct request *rq = scsi_cmd_to_rq(cmd);
+
+ if (__scsi_done(cmd))
+ return;
+
+ trace_scsi_dispatch_cmd_done(cmd);
+ blk_mq_complete_request_direct(rq, rq->q->mq_ops->complete);
+}
+EXPORT_SYMBOL(scsi_done_direct);
+
static void scsi_mq_put_budget(struct request_queue *q, int budget_token)
{
struct scsi_device *sdev = q->queuedata;
diff --git a/include/scsi/scsi_cmnd.h b/include/scsi/scsi_cmnd.h
index 6794d7322cbd..ff1c4b51f7ae 100644
--- a/include/scsi/scsi_cmnd.h
+++ b/include/scsi/scsi_cmnd.h
@@ -168,6 +168,7 @@ static inline struct scsi_driver *scsi_cmd_to_driver(struct scsi_cmnd *cmd)
}
void scsi_done(struct scsi_cmnd *cmd);
+void scsi_done_direct(struct scsi_cmnd *cmd);
extern void scsi_finish_command(struct scsi_cmnd *cmd);
--
2.14.4.44.g2045bb6
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH 2/2] scsi: target: tcm_loop: use scsi_done_direct()
2022-02-08 6:37 [PATCH 1/2] scsi: add scsi_done_direct() helper Xiaoguang Wang
@ 2022-02-08 6:37 ` Xiaoguang Wang
2022-02-11 21:49 ` [PATCH 1/2] scsi: add scsi_done_direct() helper Martin K. Petersen
1 sibling, 0 replies; 3+ messages in thread
From: Xiaoguang Wang @ 2022-02-08 6:37 UTC (permalink / raw)
To: linux-scsi, target-devel; +Cc: martin.petersen, bostroesser, kanie
Tcm_loop uses workqueue to end requests, which is non-interrupt context,
then we can complete request directly instead deferring it to softirq.
The call graph likes below:
blk_mq_complete_request_remote+1
blk_mq_complete_request+14
target_put_sess_cmd+294
transport_generic_free_cmd+93
target_complete_ok_work+251
process_one_work+482
worker_thread+80
kthread+361
ret_from_fork+31
Use tcm_loop and tcmu(backstore is file) to evaluate performance, fio
job:
[global]
filename=/dev/sdb
direct=1
runtime=30
thread=1
norandommap=1
time_based
numjobs=1
rw=randread
iodepth=32
ioengine=libaio
Without this patch:
bs 4k
READ: bw=319MiB/s (334MB/s), 319MiB/s-319MiB/s (334MB/s-334MB/s),
io=9563MiB (10.0GB), run=30001-30001msec
bs 8k:
READ: bw=611MiB/s (641MB/s), 611MiB/s-611MiB/s (641MB/s-641MB/s),
io=17.9GiB (19.2GB), run=30001-30001msec
bs 16k:
READ: bw=1109MiB/s (1163MB/s), 1109MiB/s-1109MiB/s (1163MB/s-1163MB/s),
io=32.5GiB (34.9GB), run=30001-30001msec
bs 32k:
READ: bw=2200MiB/s (2306MB/s), 2200MiB/s-2200MiB/s (2306MB/s-2306MB/s),
io=64.4GiB (69.2GB), run=30001-30001msec
With this patch:
bs 4k:
READ: bw=344MiB/s (361MB/s), 344MiB/s-344MiB/s (361MB/s-361MB/s),
io=10.1GiB (10.8GB), run=30001-30001msec
bs 8k:
READ: bw=651MiB/s (682MB/s), 651MiB/s-651MiB/s (682MB/s-682MB/s),
io=19.1GiB (20.5GB), run=30001-30001msec
bs 16k:
READ: bw=1248MiB/s (1308MB/s), 1248MiB/s-1248MiB/s (1308MB/s-1308MB/s),
io=36.6GiB (39.3GB), run=30001-30001msec
bs 32k:
READ: bw=2456MiB/s (2576MB/s), 2456MiB/s-2456MiB/s (2576MB/s-2576MB/s),
io=71.0GiB (77.3GB), run=30001-30001msec
We can get throughput improvement.
Signed-off-by: Xiaoguang Wang <xiaoguang.wang@linux.alibaba.com>
---
drivers/target/loopback/tcm_loop.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/drivers/target/loopback/tcm_loop.c b/drivers/target/loopback/tcm_loop.c
index 4407b56aa6d1..ce414fbdbae6 100644
--- a/drivers/target/loopback/tcm_loop.c
+++ b/drivers/target/loopback/tcm_loop.c
@@ -70,8 +70,12 @@ static void tcm_loop_release_cmd(struct se_cmd *se_cmd)
if (se_cmd->se_cmd_flags & SCF_SCSI_TMR_CDB)
kmem_cache_free(tcm_loop_cmd_cache, tl_cmd);
- else
- scsi_done(sc);
+ else {
+ if (unlikely(in_interrupt()))
+ scsi_done(sc);
+ else
+ scsi_done_direct(sc);
+ }
}
static int tcm_loop_show_info(struct seq_file *m, struct Scsi_Host *host)
--
2.14.4.44.g2045bb6
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH 1/2] scsi: add scsi_done_direct() helper
2022-02-08 6:37 [PATCH 1/2] scsi: add scsi_done_direct() helper Xiaoguang Wang
2022-02-08 6:37 ` [PATCH 2/2] scsi: target: tcm_loop: use scsi_done_direct() Xiaoguang Wang
@ 2022-02-11 21:49 ` Martin K. Petersen
1 sibling, 0 replies; 3+ messages in thread
From: Martin K. Petersen @ 2022-02-11 21:49 UTC (permalink / raw)
To: Xiaoguang Wang
Cc: linux-scsi, target-devel, martin.petersen, bostroesser, kanie
Xiaoguang,
> For scsi commands that are known to be completed in non-interrupt
> context, scsi_done_direct() calling blk_mq_complete_request_direct()
> can be used to completes commands directly instead deferring it
> to softirq, which can give throughput improvement.
https://lore.kernel.org/all/20220201210954.570896-1-sebastian@breakpoint.cc/
--
Martin K. Petersen Oracle Linux Engineering
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2022-02-11 21:49 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-02-08 6:37 [PATCH 1/2] scsi: add scsi_done_direct() helper Xiaoguang Wang
2022-02-08 6:37 ` [PATCH 2/2] scsi: target: tcm_loop: use scsi_done_direct() Xiaoguang Wang
2022-02-11 21:49 ` [PATCH 1/2] scsi: add scsi_done_direct() helper Martin K. Petersen
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.