diff mbox series

[10/12] mpt3sas: Reduce the performance dip

Message ID 1564840797-5876-11-git-send-email-suganath-prabu.subramani@broadcom.com (mailing list archive)
State Accepted
Headers show
Series mpt3sas: Features and defect fixes. | expand

Commit Message

Suganath Prabu S Aug. 3, 2019, 1:59 p.m. UTC
This patch is to reduce the performance dip depth
observed on SATA HDD when ATA PT command is outstanding.

Driver returns IO commands with status "SAM_STAT_BUSY" whenever
ATA PT command is outstanding. With this, IO commands will be
retried until this outstanding ATA PT to complete and hence we
will observe dip in performance.

As the driver is completing the subsequent IOs commands with
SAM_STAT_BUSY status, these IOs has to go though the block layer.
Hence it adds latency to the IOs and large performance
dip depth is observed.

So to reduce this performance dip depth, added improvement in
driver to return the subsequent IOs with SCSI_MLQUEUE_DEVICE_BUSY
status instead of completing the IOs with SAM_STAT_BUSY status
when ATA PT command is outstanding. Sending command back with
SCSI_MLQUEUE_DEVICE_BUSY does not go through complete block
layer stack (as scsi_done won't be called) SML immediately
push the command and this method will avoid latency of Block
layer stack and the performance dip depth will be reduced.


On Local setup, ran 512k sequential read IO operation on
HGST SATA drive with existing driver & with this improvement
drivers and here is the result,

1. With existing driver: IOs are running at bandwidth of
~230 rMB/s and whenever any ATA PT command is outstanding
(e.g issued from systemd-udevd daemon) then this bandwidth drops
to ~150 rMB/s.

2. With this improvement driver: IOs are running at bandwidth of
~230 rMB/s and whenever any ATA PT command is outstanding 
then this bandwidth drops to just ~190 rMB/s.

Signed-off-by: Suganath Prabu <suganath-prabu.subramani@broadcom.com>
---
 drivers/scsi/mpt3sas/mpt3sas_scsih.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)
diff mbox series

Patch

diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
index 9b89fa4..24b5f5f 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
@@ -4670,11 +4670,8 @@  scsih_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd)
 	 * since we're lockless at this point
 	 */
 	do {
-		if (test_bit(0, &sas_device_priv_data->ata_command_pending)) {
-			scmd->result = SAM_STAT_BUSY;
-			scmd->scsi_done(scmd);
-			return 0;
-		}
+		if (test_bit(0, &sas_device_priv_data->ata_command_pending))
+			return SCSI_MLQUEUE_DEVICE_BUSY;
 	} while (_scsih_set_satl_pending(scmd, true));
 
 	if (scmd->sc_data_direction == DMA_FROM_DEVICE)