mpt3sas: Enable scsi MQ & lockless command submission
Subsystems (3)
Suganath Prabu S
maintainercover mpt3sas: Enable scsi MQ & lockless command submission
From: Hannes Reinecke <[email protected]>
Hi all,
This patch set is initially posted by Hannes Reinecke to enable scsi multiqueue for the mpt3sas driver.
While the HBA only has a single mailbox register for submitting commands, it does have individual receive queues per MSI-X interrupt and as such does benefit from converting it to full multiqueue support.
Suganath Prabu S (11):
mpt3sas: set default value for cb_idx
mpt3sas: use list_splice_init()
mpt3sas: separate out _base_recovery_check()
mpt3sas: open-code _scsih_scsi_lookup_get()
mpt3sas: Introduce mpt3sas_get_st_from_smid()
mpt3sas: check command status before attempting abort
mpt3sas: always use first reserved smid for ioctl passthrough
mpt3sas: simplify task management functions
mpt3sas: simplify mpt3sas_scsi_issue_tm()
mpt3sas: simplify _wait_for_commands_to_complete()
mpt3sas: lockless command submission
drivers/scsi/mpt3sas/mpt3sas_base.c | 199 +++++++++++---------- drivers/scsi/mpt3sas/mpt3sas_base.h | 29 ++- drivers/scsi/mpt3sas/mpt3sas_ctl.c | 31 ++-- drivers/scsi/mpt3sas/mpt3sas_scsih.c | 292 +++++++------------------------ drivers/scsi/mpt3sas/mpt3sas_warpdrive.c | 33 +--- 5 files changed, 191 insertions(+), 393 deletions(-)
Thanks,
Suganath Prabu S
Signature · 1 line
2.5.5
Suganath Prabu S
maintainerPATCH RESEND 1/11 mpt3sas: set default value for cb_idx
From: Hannes Reinecke <[email protected]>
No functional change
--- drivers/scsi/mpt3sas/mpt3sas_base.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/scsi/mpt3sas/mpt3sas_base.c +2 -3
@@ -899,7 +899,7 @@ static u8 _base_get_cb_idx(struct MPT3SAS_ADAPTER *ioc, u16 smid) { int i; -u8 cb_idx; +u8 cb_idx =0xFF ;if (smid < ioc->hi_priority_smid) { i = smid -1 ;
@@ -910,8 +910,7 @@ _base_get_cb_idx(struct MPT3SAS_ADAPTER *ioc, u16 smid) }else if (smid <= ioc->hba_queue_depth) { i = smid - ioc->internal_smid; cb_idx = ioc->internal_lookup[i].cb_idx; - }else - cb_idx =0xFF ; + }return cb_idx; }
Signature · 1 line
2.5.5
Suganath Prabu S
maintainerPATCH RESEND 2/11 mpt3sas: use list_splice_init()
In reply to Suganath Prabu SFrom: Hannes Reinecke <[email protected]>
Use 'list_splice_init()' instead of hand-crafted function. No functional change.
--- drivers/scsi/mpt3sas/mpt3sas_base.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-)
drivers/scsi/mpt3sas/mpt3sas_base.c +2 -9
@@ -2885,20 +2885,13 @@ mpt3sas_base_free_smid(struct MPT3SAS_ADAPTER *ioc, u16 smid) {unsigned long flags;int i; -struct chain_tracker *chain_req, *next;spin_lock_irqsave (&ioc->scsi_lookup_lock, flags);if (smid < ioc->hi_priority_smid) {/* scsiio queue */ i = smid -1 ; -if (!list_empty (&ioc->scsi_lookup[i].chain_list)) { -list_for_each_entry_safe (chain_req, next, - &ioc->scsi_lookup[i].chain_list, tracker_list) { -list_del_init (&chain_req->tracker_list); -list_add (&chain_req->tracker_list, - &ioc->free_chain_list); - } - } +list_splice_init (&ioc->scsi_lookup[i].chain_list, + &ioc->free_chain_list); ioc->scsi_lookup[i].cb_idx =0xFF ; ioc->scsi_lookup[i].scmd =NULL ; ioc->scsi_lookup[i].direct_io =0 ;
Signature · 1 line
2.5.5
Suganath Prabu S
maintainerPATCH RESEND 3/11 mpt3sas: separate out _base_recovery_check()
In reply to Suganath Prabu SFrom: Hannes Reinecke <[email protected]>
No functional change.
--- drivers/scsi/mpt3sas/mpt3sas_base.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-)
drivers/scsi/mpt3sas/mpt3sas_base.c +14 -9
@@ -2873,6 +2873,19 @@ mpt3sas_base_get_smid_hpr(struct MPT3SAS_ADAPTER *ioc, u8 cb_idx)return smid; } +static void +_base_recovery_check (struct MPT3SAS_ADAPTER *ioc) +{ +/* +* See _wait_for_commands_to_complete() call with regards to this code. +*/ +if (ioc->shost_recovery && ioc->pending_io_count) { +if (ioc->pending_io_count ==1 ) +wake_up (&ioc->reset_wq); + ioc->pending_io_count--; + } +} +/** * mpt3sas_base_free_smid - put smid back on free_list * @ioc: per adapter object
@@ -2898,15 +2911,7 @@ mpt3sas_base_free_smid(struct MPT3SAS_ADAPTER *ioc, u16 smid)list_add (&ioc->scsi_lookup[i].tracker_list, &ioc->free_list);spin_unlock_irqrestore (&ioc->scsi_lookup_lock, flags); -/* -* See _wait_for_commands_to_complete() call with regards -* to this code. -*/ -if (ioc->shost_recovery && ioc->pending_io_count) { -if (ioc->pending_io_count ==1 ) -wake_up (&ioc->reset_wq); - ioc->pending_io_count--; - } +_base_recovery_check (ioc);return ; }else if (smid < ioc->internal_smid) {/* hi-priority */
Signature · 1 line
2.5.5
Suganath Prabu S
maintainerPATCH RESEND 4/11 mpt3sas: open-code _scsih_scsi_lookup_get()
In reply to Suganath Prabu SFrom: Hannes Reinecke <[email protected]>
Just a wrapper around the scsi lookup array and only used in one place, so open-code it.
--- drivers/scsi/mpt3sas/mpt3sas_scsih.c | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-)
drivers/scsi/mpt3sas/mpt3sas_scsih.c +1 -14
@@ -1445,19 +1445,6 @@ _scsih_is_nvme_device(u32 device_info) }/** -* _scsih_scsi_lookup_get - returns scmd entry -* @ioc: per adapter object -* @smid: system request message index -* -* Returns the smid stored scmd pointer. -*/ -static struct scsi_cmnd * -_scsih_scsi_lookup_get (struct MPT3SAS_ADAPTER *ioc,u16 smid) -{ -return ioc->scsi_lookup[smid -1 ].scmd; -} - -/** * __scsih_scsi_lookup_get_clear - returns scmd entry without * holding any lock. * @ioc: per adapter object
@@ -7543,7 +7530,7 @@ _scsih_sas_broadcast_primitive_event(struct MPT3SAS_ADAPTER *ioc,for (smid =1 ; smid <= ioc->scsiio_depth; smid++) {if (ioc->shost_recovery) goto out; - scmd =_scsih_scsi_lookup_get (ioc, smid); + scmd = ioc->scsi_lookup[smid -1 ].scmd;if (!scmd)continue ; sdev = scmd->device;
Signature · 1 line
2.5.5
Suganath Prabu S
maintainerPATCH RESEND 5/11 mpt3sas: Introduce mpt3sas_get_st_from_smid()
In reply to Suganath Prabu SFrom: Hannes Reinecke <[email protected]>
Abstract accesses to the scsi_lookup array by introducing mpt3sas_get_st_from_smid().
--- drivers/scsi/mpt3sas/mpt3sas_base.c | 22 ++++++++++++++++++---- drivers/scsi/mpt3sas/mpt3sas_base.h | 2 ++ drivers/scsi/mpt3sas/mpt3sas_scsih.c | 7 ++++--- drivers/scsi/mpt3sas/mpt3sas_warpdrive.c | 4 +++- 4 files changed, 27 insertions(+), 8 deletions(-)
drivers/scsi/mpt3sas/mpt3sas_base.c +18 -4
@@ -888,6 +888,15 @@ _base_async_event(struct MPT3SAS_ADAPTER *ioc, u8 msix_index, u32 reply)return 1 ; } +struct scsiio_tracker * +mpt3sas_get_st_from_smid (struct MPT3SAS_ADAPTER *ioc,u16 smid) +{ +if (WARN_ON (!smid) || +WARN_ON (smid >= ioc->hi_priority_smid)) +return NULL ; +return &ioc->scsi_lookup[smid -1 ]; +} +/** * _base_get_cb_idx - obtain the callback index * @ioc: per adapter object
@@ -902,8 +911,11 @@ _base_get_cb_idx(struct MPT3SAS_ADAPTER *ioc, u16 smid)u8 cb_idx =0xFF ;if (smid < ioc->hi_priority_smid) { - i = smid -1 ; - cb_idx = ioc->scsi_lookup[i].cb_idx; +struct scsiio_tracker *st; + + st =mpt3sas_get_st_from_smid (ioc, smid); +if (st) + cb_idx = st->cb_idx; }else if (smid < ioc->internal_smid) { i = smid - ioc->hi_priority_smid; cb_idx = ioc->hpr_lookup[i].cb_idx;
@@ -1294,6 +1306,7 @@ static struct chain_tracker * _base_get_chain_buffer_tracker(struct MPT3SAS_ADAPTER *ioc, u16 smid) {struct chain_tracker *chain_req; +struct scsiio_tracker *st;unsigned long flags;spin_lock_irqsave (&ioc->scsi_lookup_lock, flags);
@@ -1306,8 +1319,9 @@ _base_get_chain_buffer_tracker(struct MPT3SAS_ADAPTER *ioc, u16 smid) chain_req =list_entry (ioc->free_chain_list.next, struct chain_tracker, tracker_list);list_del_init (&chain_req->tracker_list); -list_add_tail (&chain_req->tracker_list, - &ioc->scsi_lookup[smid -1 ].chain_list); + st =mpt3sas_get_st_from_smid (ioc, smid); +if (st) +list_add_tail (&chain_req->tracker_list, &st->chain_list);spin_unlock_irqrestore (&ioc->scsi_lookup_lock, flags);return chain_req; }
drivers/scsi/mpt3sas/mpt3sas_base.h +2 -0
@@ -1402,6 +1402,8 @@ void mpt3sas_base_sync_reply_irqs(struct MPT3SAS_ADAPTER *ioc);u16 mpt3sas_base_get_smid_hpr (struct MPT3SAS_ADAPTER *ioc,u8 cb_idx);u16 mpt3sas_base_get_smid_scsiio (struct MPT3SAS_ADAPTER *ioc,u8 cb_idx,struct scsi_cmnd *scmd); +struct scsiio_tracker *mpt3sas_get_st_from_smid (struct MPT3SAS_ADAPTER *ioc, +u16 smid);u16 mpt3sas_base_get_smid (struct MPT3SAS_ADAPTER *ioc,u8 cb_idx);void mpt3sas_base_free_smid (struct MPT3SAS_ADAPTER *ioc,u16 smid);
drivers/scsi/mpt3sas/mpt3sas_scsih.c +4 -3
@@ -2779,7 +2779,7 @@ mpt3sas_scsih_issue_tm(struct MPT3SAS_ADAPTER *ioc, u16 handle, uint channel, }if (type ==MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK ) - scsi_lookup = &ioc->scsi_lookup[smid_task -1 ]; + scsi_lookup =mpt3sas_get_st_from_smid (ioc, smid_task); dtmprintk(ioc, pr_info(MPT3SAS_FMT "sending tm: handle(0x%04x), task_type(0x%02x), smid(%d)\n",
@@ -2797,7 +2797,8 @@ mpt3sas_scsih_issue_tm(struct MPT3SAS_ADAPTER *ioc, u16 handle, uint channel,mpt3sas_scsih_set_tm_flag (ioc, handle);init_completion (&ioc->tm_cmds.done);if ((type ==MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK ) && - (scsi_lookup->msix_io < ioc->reply_queue_count)) + scsi_lookup && + (scsi_lookup->msix_io < ioc->reply_queue_count)) msix_task = scsi_lookup->msix_io;else msix_task =0 ;
@@ -2838,7 +2839,7 @@ mpt3sas_scsih_issue_tm(struct MPT3SAS_ADAPTER *ioc, u16 handle, uint channel,switch (type) {case MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK : rc =SUCCESS ; -if (scsi_lookup->scmd ==NULL ) +if (scsi_lookup && scsi_lookup->scmd ==NULL )break ; rc =FAILED ;break ;
drivers/scsi/mpt3sas/mpt3sas_warpdrive.c +3 -1
@@ -270,7 +270,9 @@ out_error:inline u8 mpt3sas_scsi_direct_io_get (struct MPT3SAS_ADAPTER *ioc,u16 smid) { -return ioc->scsi_lookup[smid -1 ].direct_io; +struct scsiio_tracker *st =mpt3sas_get_st_from_smid (ioc, smid); + +return st ? st->direct_io :0 ; }/**
Signature · 1 line
2.5.5
Suganath Prabu S
maintainerPATCH RESEND 6/11 mpt3sas: check command status before attempting abort
In reply to Suganath Prabu SFrom: Hannes Reinecke <[email protected]>
When attempting a command abort we should check the command status prior to sending the abort; the command might've been completed already.
--- drivers/scsi/mpt3sas/mpt3sas_scsih.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
drivers/scsi/mpt3sas/mpt3sas_scsih.c +8 -3
@@ -2771,6 +2771,14 @@ mpt3sas_scsih_issue_tm(struct MPT3SAS_ADAPTER *ioc, u16 handle, uint channel,return (!rc) ?SUCCESS :FAILED ; } +if (type ==MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK ) { + scsi_lookup =mpt3sas_get_st_from_smid (ioc, smid_task); +if (!scsi_lookup) +return FAILED ; +if (scsi_lookup->cb_idx ==0xFF ) +return SUCCESS ; + } + smid =mpt3sas_base_get_smid_hpr (ioc, ioc->tm_cb_idx);if (!smid) { pr_err(MPT3SAS_FMT "%s: failed obtaining a smid\n",
@@ -2778,9 +2786,6 @@ mpt3sas_scsih_issue_tm(struct MPT3SAS_ADAPTER *ioc, u16 handle, uint channel,return FAILED ; } -if (type ==MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK ) - scsi_lookup =mpt3sas_get_st_from_smid (ioc, smid_task); -dtmprintk (ioc,pr_info (MPT3SAS_FMT "sending tm: handle(0x%04x), task_type(0x%02x), smid(%d)\n" , ioc->name, handle, type, smid_task));
Signature · 1 line
2.5.5
Suganath Prabu S
maintainerPATCH RESEND 7/11 mpt3sas: always use first reserved smid for ioctl passthrough
In reply to Suganath Prabu SFrom: Hannes Reinecke <[email protected]>
ioctl passthrough commands require a SCSIIO smid, but cannot easily integrate with the block layer. But the driver already has reserved some SCSIIO smids and we're only ever allowing one ioctl command at a time we can use the first reserved smid for ioctl commands.
--- drivers/scsi/mpt3sas/mpt3sas_base.c | 19 +++++++++++++------ drivers/scsi/mpt3sas/mpt3sas_ctl.c | 10 ++-------- 2 files changed, 15 insertions(+), 14 deletions(-)
drivers/scsi/mpt3sas/mpt3sas_base.c +13 -6
@@ -908,14 +908,18 @@ static u8 _base_get_cb_idx(struct MPT3SAS_ADAPTER *ioc, u16 smid) { int i; +u16 ctl_smid = ioc->scsiio_depth -INTERNAL_SCSIIO_CMDS_COUNT +1 ;u8 cb_idx =0xFF ;if (smid < ioc->hi_priority_smid) {struct scsiio_tracker *st; - st =mpt3sas_get_st_from_smid (ioc, smid); -if (st) - cb_idx = st->cb_idx; +if (smid < ctl_smid) { + st =mpt3sas_get_st_from_smid (ioc, smid); +if (st) + cb_idx = st->cb_idx; + }else if (smid == ctl_smid) + cb_idx = ioc->ctl_cb_idx; }else if (smid < ioc->internal_smid) { i = smid - ioc->hi_priority_smid; cb_idx = ioc->hpr_lookup[i].cb_idx;
@@ -2922,7 +2926,9 @@ mpt3sas_base_free_smid(struct MPT3SAS_ADAPTER *ioc, u16 smid) ioc->scsi_lookup[i].cb_idx =0xFF ; ioc->scsi_lookup[i].scmd =NULL ; ioc->scsi_lookup[i].direct_io =0 ; -list_add (&ioc->scsi_lookup[i].tracker_list, &ioc->free_list); +if (i < ioc->scsiio_depth -INTERNAL_SCSIIO_CMDS_COUNT ) +list_add (&ioc->scsi_lookup[i].tracker_list, + &ioc->free_list);spin_unlock_irqrestore (&ioc->scsi_lookup_lock, flags);_base_recovery_check (ioc);
@@ -5787,8 +5793,9 @@ _base_make_ioc_operational(struct MPT3SAS_ADAPTER *ioc) ioc->scsi_lookup[i].smid = smid; ioc->scsi_lookup[i].scmd =NULL ; ioc->scsi_lookup[i].direct_io =0 ; -list_add_tail (&ioc->scsi_lookup[i].tracker_list, - &ioc->free_list); +if (i < ioc->scsiio_depth -INTERNAL_SCSIIO_CMDS_COUNT ) +list_add_tail (&ioc->scsi_lookup[i].tracker_list, + &ioc->free_list); }/* hi-priority queue */
drivers/scsi/mpt3sas/mpt3sas_ctl.c +2 -8
@@ -724,14 +724,8 @@ _ctl_do_mpt_command(struct MPT3SAS_ADAPTER *ioc, struct mpt3_ioctl_command karg, goto out; } }else { - - smid =mpt3sas_base_get_smid_scsiio (ioc, ioc->ctl_cb_idx,NULL ); -if (!smid) { -pr_err (MPT3SAS_FMT "%s: failed obtaining a smid\n" , - ioc->name, __func__); - ret = -EAGAIN ; - goto out; - } +/* Use first reserved smid for passthrough ioctls */ + smid = ioc->scsiio_depth -INTERNAL_SCSIIO_CMDS_COUNT +1 ; } ret =0 ;
Signature · 1 line
2.5.5
Suganath Prabu S
maintainerPATCH RESEND 8/11 mpt3sas: simplify task management functions
In reply to Suganath Prabu SFrom: Hannes Reinecke <[email protected]>
No functional change. Code optimization.
One can simply check 'target_busy' or 'device_busy' when figuring out if there are outstanding commands; no need to painstakingly counting them by hand.
--- drivers/scsi/mpt3sas/mpt3sas_scsih.c | 88 +++--------------------------------- 1 file changed, 7 insertions(+), 81 deletions(-)
drivers/scsi/mpt3sas/mpt3sas_scsih.c +7 -81
@@ -1517,74 +1517,6 @@ _scsih_scsi_lookup_find_by_scmd(struct MPT3SAS_ADAPTER *ioc, struct scsi_cmnd }/** -* _scsih_scsi_lookup_find_by_target - search for matching channel:id -* @ioc: per adapter object -* @id: target id -* @channel: channel -* Context: This function will acquire ioc->scsi_lookup_lock. -* -* This will search for a matching channel:id in the scsi_lookup array, -* returning 1 if found. -*/ -static u8 -_scsih_scsi_lookup_find_by_target (struct MPT3SAS_ADAPTER *ioc,int id, -int channel) -{ -u8 found; -unsigned long flags; -int i; - -spin_lock_irqsave (&ioc->scsi_lookup_lock, flags); - found =0 ; -for (i =0 ; i < ioc->scsiio_depth; i++) { -if (ioc->scsi_lookup[i].scmd && - (ioc->scsi_lookup[i].scmd->device->id == id && - ioc->scsi_lookup[i].scmd->device->channel == channel)) { - found =1 ; - goto out; - } - } - out: -spin_unlock_irqrestore (&ioc->scsi_lookup_lock, flags); -return found; -} - -/** -* _scsih_scsi_lookup_find_by_lun - search for matching channel:id:lun -* @ioc: per adapter object -* @id: target id -* @lun: lun number -* @channel: channel -* Context: This function will acquire ioc->scsi_lookup_lock. -* -* This will search for a matching channel:id:lun in the scsi_lookup array, -* returning 1 if found. -*/ -static u8 -_scsih_scsi_lookup_find_by_lun (struct MPT3SAS_ADAPTER *ioc,int id, -unsigned int lun,int channel) -{ -u8 found; -unsigned long flags; -int i; - -spin_lock_irqsave (&ioc->scsi_lookup_lock, flags); - found =0 ; -for (i =0 ; i < ioc->scsiio_depth; i++) { -if (ioc->scsi_lookup[i].scmd && - (ioc->scsi_lookup[i].scmd->device->id == id && - ioc->scsi_lookup[i].scmd->device->channel == channel && - ioc->scsi_lookup[i].scmd->device->lun == lun)) { - found =1 ; - goto out; - } - } - out: -spin_unlock_irqrestore (&ioc->scsi_lookup_lock, flags); -return found; -} - -/** * scsih_change_queue_depth - setting device queue depth * @sdev: scsi device struct * @qdepth: requested queue depth
@@ -2849,19 +2781,9 @@ mpt3sas_scsih_issue_tm(struct MPT3SAS_ADAPTER *ioc, u16 handle, uint channel, rc =FAILED ;break ; -case MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET : -if (_scsih_scsi_lookup_find_by_target (ioc, id, channel)) - rc =FAILED ; -else - rc =SUCCESS ; -break ;case MPI2_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET :case MPI2_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET : -if (_scsih_scsi_lookup_find_by_lun (ioc, id, lun, channel)) - rc =FAILED ; -else - rc =SUCCESS ; -break ; +case MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET :case MPI2_SCSITASKMGMT_TASKTYPE_QUERY_TASK : rc =SUCCESS ;break ;
@@ -3082,7 +3004,9 @@ scsih_dev_reset(struct scsi_cmnd *scmd) r =mpt3sas_scsih_issue_locked_tm (ioc, handle, scmd->device->channel, scmd->device->id, scmd->device->lun,MPI2_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET ,0 ,30 ); - +/* Check for busy commands after reset */ +if (r ==SUCCESS &&atomic_read (&scmd->device->device_busy)) + r =FAILED ; out:sdev_printk (KERN_INFO , scmd->device,"device reset: %s scmd(%p)\n" , ((r ==SUCCESS ) ?"SUCCESS" :"FAILED" ), scmd);
@@ -3144,7 +3068,9 @@ scsih_target_reset(struct scsi_cmnd *scmd) r =mpt3sas_scsih_issue_locked_tm (ioc, handle, scmd->device->channel, scmd->device->id,0 ,MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET ,0 ,30 ); - +/* Check for busy commands after reset */ +if (r ==SUCCESS &&atomic_read (&starget->target_busy)) + r =FAILED ; out:starget_printk (KERN_INFO , starget,"target reset: %s scmd(%p)\n" , ((r ==SUCCESS ) ?"SUCCESS" :"FAILED" ), scmd);
Signature · 1 line
2.5.5
Suganath Prabu S
maintainerPATCH RESEND 9/11 mpt3sas: simplify mpt3sas_scsi_issue_tm()
In reply to Suganath Prabu SFrom: Hannes Reinecke <[email protected]>
Move the check for outstanding commands out of the function allowing us to simplify the overall code.
--- drivers/scsi/mpt3sas/mpt3sas_base.h | 6 +- drivers/scsi/mpt3sas/mpt3sas_ctl.c | 4 +- drivers/scsi/mpt3sas/mpt3sas_scsih.c | 106 ++++++++++++----------------------- 3 files changed, 41 insertions(+), 75 deletions(-)
drivers/scsi/mpt3sas/mpt3sas_base.h +2 -4
@@ -1444,11 +1444,9 @@ u8 mpt3sas_scsih_event_callback(struct MPT3SAS_ADAPTER *ioc, u8 msix_index,void mpt3sas_scsih_reset_handler (struct MPT3SAS_ADAPTER *ioc,int reset_phase);int mpt3sas_scsih_issue_tm (struct MPT3SAS_ADAPTER *ioc,u16 handle, -uint channel,uint id,uint lun,u8 type,u16 smid_task, -ulong timeout); +u64 lun,u8 type,u16 smid_task,u16 msix_task,ulong timeout);int mpt3sas_scsih_issue_locked_tm (struct MPT3SAS_ADAPTER *ioc,u16 handle, -uint channel,uint id,uint lun,u8 type,u16 smid_task, -ulong timeout); +u64 lun,u8 type,u16 smid_task,u16 msix_task,ulong timeout);void mpt3sas_scsih_set_tm_flag (struct MPT3SAS_ADAPTER *ioc,u16 handle);void mpt3sas_scsih_clear_tm_flag (struct MPT3SAS_ADAPTER *ioc,u16 handle);
drivers/scsi/mpt3sas/mpt3sas_ctl.c +2 -2
@@ -1075,8 +1075,8 @@ _ctl_do_mpt_command(struct MPT3SAS_ADAPTER *ioc, struct mpt3_ioctl_command karg, le16_to_cpu(mpi_request->FunctionDependent1));mpt3sas_halt_firmware (ioc);mpt3sas_scsih_issue_locked_tm (ioc, -le16_to_cpu (mpi_request->FunctionDependent1),0 ,0 , -0 ,MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET ,0 ,30 ); +le16_to_cpu (mpi_request->FunctionDependent1),0 , +MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET ,0 ,0 ,30 ); }else mpt3sas_base_hard_reset_handler (ioc,FORCE_BIG_HAMMER ); }
drivers/scsi/mpt3sas/mpt3sas_scsih.c +37 -69
232 lines not on this page · raw message
Signature · 1 line
2.5.5
Suganath Prabu S
maintainerPATCH RESEND 10/11 mpt3sas: simplify _wait_for_commands_to_complete()
In reply to Suganath Prabu SFrom: Hannes Reinecke <[email protected]>
Use 'host_busy' instead of counting outstanding commands by hand.
--- drivers/scsi/mpt3sas/mpt3sas_base.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-)
drivers/scsi/mpt3sas/mpt3sas_base.c +4 -10
@@ -2898,9 +2898,9 @@ _base_recovery_check(struct MPT3SAS_ADAPTER *ioc)* See _wait_for_commands_to_complete() call with regards to this code. */ if (ioc->shost_recovery && ioc->pending_io_count) { -if (ioc->pending_io_count ==1 ) + ioc->pending_io_count =atomic_read (&ioc->shost->host_busy); +if (ioc->pending_io_count ==0 )wake_up (&ioc->reset_wq); - ioc->pending_io_count--; } }
@@ -6310,15 +6310,13 @@ _base_reset_handler(struct MPT3SAS_ADAPTER *ioc, int reset_phase)* _wait_for_commands_to_complete - reset controller * @ioc: Pointer to MPT_ADAPTER structure * -* This function waiting(3s) for all pending commands to complete +* This function is waiting 10s for all pending commands to complete * prior to putting controller in reset. */ static void _wait_for_commands_to_complete (struct MPT3SAS_ADAPTER *ioc) {u32 ioc_state; -unsigned long flags; -u16 i; ioc->pending_io_count =0 ;
@@ -6327,11 +6325,7 @@ _wait_for_commands_to_complete(struct MPT3SAS_ADAPTER *ioc)return ;/* pending command count */ -spin_lock_irqsave (&ioc->scsi_lookup_lock, flags); -for (i =0 ; i < ioc->scsiio_depth; i++) -if (ioc->scsi_lookup[i].cb_idx !=0xFF ) - ioc->pending_io_count++; -spin_unlock_irqrestore (&ioc->scsi_lookup_lock, flags); + ioc->pending_io_count =atomic_read (&ioc->shost->host_busy);if (!ioc->pending_io_count)return ;
Signature · 1 line
2.5.5
Suganath Prabu S
maintainerPATCH RESEND 11/11 mpt3sas: lockless command submission
In reply to Suganath Prabu SPerformance improvement using block layer tag. Curent driver gets scsiio tracker and free smid from link list and array based tracking managed by driver. Accessing list in main io path is performance pentaly because of protection using spinlock "scsi_lookup_lock".
In this patch -
1. Driver removes all link list access from main io path and use scmd->request->tag to get free smid.
2. Instead of holding 'struct scsiio_tracker' in its own pool driver can embed it into the scsi command.
Driver provides cmd_size in scsi_host_template, so that struct scsiio_tracker is preallocated by scsi mid layer for each scsi command.
--- drivers/scsi/mpt3sas/mpt3sas_base.c | 147 ++++++++++++++----------------- drivers/scsi/mpt3sas/mpt3sas_base.h | 25 ++---- drivers/scsi/mpt3sas/mpt3sas_ctl.c | 17 ++-- drivers/scsi/mpt3sas/mpt3sas_scsih.c | 121 ++++++++----------------- drivers/scsi/mpt3sas/mpt3sas_warpdrive.c | 35 +------- 5 files changed, 124 insertions(+), 221 deletions(-)
drivers/scsi/mpt3sas/mpt3sas_base.c +67 -80
@@ -889,12 +889,19 @@ _base_async_event(struct MPT3SAS_ADAPTER *ioc, u8 msix_index, u32 reply) }struct scsiio_tracker * -mpt3sas_get_st_from_smid (struct MPT3SAS_ADAPTER *ioc,u16 smid) +_get_st_from_smid (struct MPT3SAS_ADAPTER *ioc,u16 smid) { +struct scsi_cmnd *cmd; +if (WARN_ON (!smid) ||WARN_ON (smid >= ioc->hi_priority_smid))return NULL ; -return &ioc->scsi_lookup[smid -1 ]; + + cmd =mpt3sas_scsih_scsi_lookup_get (ioc, smid); +if (cmd) +return scsi_cmd_priv (cmd); + +return NULL ; }/**
@@ -915,7 +922,7 @@ _base_get_cb_idx(struct MPT3SAS_ADAPTER *ioc, u16 smid)struct scsiio_tracker *st;if (smid < ctl_smid) { - st =mpt3sas_get_st_from_smid (ioc, smid); + st =_get_st_from_smid (ioc, smid);if (st) cb_idx = st->cb_idx; }else if (smid == ctl_smid)
@@ -1302,15 +1309,16 @@ _base_add_sg_single_64(void *paddr, u32 flags_length, dma_addr_t dma_addr)/** * _base_get_chain_buffer_tracker - obtain chain tracker * @ioc: per adapter object -* @smid: smid associated to an IO request +* @scmd: SCSI commands of the IO request * * Returns chain tracker(from ioc->free_chain_list) */ static struct chain_tracker * -_base_get_chain_buffer_tracker (struct MPT3SAS_ADAPTER *ioc,u16 smid) +_base_get_chain_buffer_tracker (struct MPT3SAS_ADAPTER *ioc, +struct scsi_cmnd *scmd) {struct chain_tracker *chain_req; -struct scsiio_tracker *st; +struct scsiio_tracker *st =scsi_cmd_priv (scmd);unsigned long flags;spin_lock_irqsave (&ioc->scsi_lookup_lock, flags);
@@ -1323,9 +1331,7 @@ _base_get_chain_buffer_tracker(struct MPT3SAS_ADAPTER *ioc, u16 smid) chain_req =list_entry (ioc->free_chain_list.next, struct chain_tracker, tracker_list);list_del_init (&chain_req->tracker_list); - st =mpt3sas_get_st_from_smid (ioc, smid); -if (st) -list_add_tail (&chain_req->tracker_list, &st->chain_list); +list_add_tail (&chain_req->tracker_list, &st->chain_list);spin_unlock_irqrestore (&ioc->scsi_lookup_lock, flags);return chain_req; }
@@ -1940,7 +1946,7 @@ _base_build_sg_scmd(struct MPT3SAS_ADAPTER *ioc,/* initializing the chain flags and pointers */ chain_flags =MPI2_SGE_FLAGS_CHAIN_ELEMENT <<MPI2_SGE_FLAGS_SHIFT ; - chain_req =_base_get_chain_buffer_tracker (ioc, smid); + chain_req =_base_get_chain_buffer_tracker (ioc, scmd);if (!chain_req)return -1 ; chain = chain_req->chain_buffer;
@@ -1980,7 +1986,7 @@ _base_build_sg_scmd(struct MPT3SAS_ADAPTER *ioc, sges_in_segment--; } - chain_req =_base_get_chain_buffer_tracker (ioc, smid); + chain_req =_base_get_chain_buffer_tracker (ioc, scmd);if (!chain_req)return -1 ; chain = chain_req->chain_buffer;
@@ -2083,7 +2089,7 @@ _base_build_sg_scmd_ieee(struct MPT3SAS_ADAPTER *ioc, }/* initializing the pointers */ - chain_req =_base_get_chain_buffer_tracker (ioc, smid); + chain_req =_base_get_chain_buffer_tracker (ioc, scmd);if (!chain_req)return -1 ; chain = chain_req->chain_buffer;
@@ -2114,7 +2120,7 @@ _base_build_sg_scmd_ieee(struct MPT3SAS_ADAPTER *ioc, sges_in_segment--; } - chain_req =_base_get_chain_buffer_tracker (ioc, smid); + chain_req =_base_get_chain_buffer_tracker (ioc, scmd);if (!chain_req)return -1 ; chain = chain_req->chain_buffer;
@@ -2759,7 +2765,7 @@ mpt3sas_base_get_sense_buffer_dma(struct MPT3SAS_ADAPTER *ioc, u16 smid)void *mpt3sas_base_get_pcie_sgl (struct MPT3SAS_ADAPTER *ioc,u16 smid) { -return (void *)(ioc->scsi_lookup[smid -1 ].pcie_sg_list.pcie_sgl); +return (void *)(ioc->pcie_sg_lookup[smid -1 ].pcie_sgl); }/**
@@ -2772,7 +2778,7 @@ mpt3sas_base_get_pcie_sgl(struct MPT3SAS_ADAPTER *ioc, u16 smid)dma_addr_t mpt3sas_base_get_pcie_sgl_dma (struct MPT3SAS_ADAPTER *ioc,u16 smid) { -return ioc->scsi_lookup[smid -1 ].pcie_sg_list.pcie_sgl_dma; +return ioc->pcie_sg_lookup[smid -1 ].pcie_sgl_dma; }/**
@@ -2839,26 +2845,15 @@ u16 mpt3sas_base_get_smid_scsiio(struct MPT3SAS_ADAPTER *ioc, u8 cb_idx, struct scsi_cmnd *scmd) { - unsigned long flags; -struct scsiio_tracker *request; + struct scsiio_tracker *request = scsi_cmd_priv(scmd); +unsigned int tag = scmd->request->tag;u16 smid; -spin_lock_irqsave (&ioc->scsi_lookup_lock, flags); -if (list_empty (&ioc->free_list)) { -spin_unlock_irqrestore (&ioc->scsi_lookup_lock, flags); -pr_err (MPT3SAS_FMT "%s: smid not available\n" , - ioc->name, __func__); -return 0 ; - } - - request =list_entry (ioc->free_list.next, - struct scsiio_tracker, tracker_list); - request->scmd = scmd; + smid = tag +1 ; request->cb_idx = cb_idx; - smid = request->smid; request->msix_io =_base_get_msix_index (ioc); -list_del (&request->tracker_list); -spin_unlock_irqrestore (&ioc->scsi_lookup_lock, flags); + request->smid = smid; +INIT_LIST_HEAD (&request->chain_list);return smid; }
@@ -2904,6 +2899,22 @@ _base_recovery_check(struct MPT3SAS_ADAPTER *ioc) } } +void mpt3sas_base_clear_st (struct MPT3SAS_ADAPTER *ioc, +struct scsiio_tracker *st) +{ +if (WARN_ON (st->smid ==0 )) +return ; + st->cb_idx =0xFF ; + st->direct_io =0 ; +if (!list_empty (&st->chain_list)) { +unsigned long flags; + +spin_lock_irqsave (&ioc->scsi_lookup_lock, flags); +list_splice_init (&st->chain_list, &ioc->free_chain_list); +spin_unlock_irqrestore (&ioc->scsi_lookup_lock, flags); + } +} +/** * mpt3sas_base_free_smid - put smid back on free_list * @ioc: per adapter object
@@ -2917,23 +2928,21 @@ mpt3sas_base_free_smid(struct MPT3SAS_ADAPTER *ioc, u16 smid)unsigned long flags;int i; -spin_lock_irqsave (&ioc->scsi_lookup_lock, flags);if (smid < ioc->hi_priority_smid) { -/* scsiio queue */ - i = smid -1 ; -list_splice_init (&ioc->scsi_lookup[i].chain_list, - &ioc->free_chain_list); - ioc->scsi_lookup[i].cb_idx =0xFF ; - ioc->scsi_lookup[i].scmd =NULL ; - ioc->scsi_lookup[i].direct_io =0 ; -if (i < ioc->scsiio_depth -INTERNAL_SCSIIO_CMDS_COUNT ) -list_add (&ioc->scsi_lookup[i].tracker_list, - &ioc->free_list); -spin_unlock_irqrestore (&ioc->scsi_lookup_lock, flags); +struct scsiio_tracker *st; + st =_get_st_from_smid (ioc, smid); +if (!st) { +_base_recovery_check (ioc); +return ; + } +mpt3sas_base_clear_st (ioc, st);_base_recovery_check (ioc);return ; - }else if (smid < ioc->internal_smid) { + } + +spin_lock_irqsave (&ioc->scsi_lookup_lock, flags); +if (smid < ioc->internal_smid) {/* hi-priority */ i = smid - ioc->hi_priority_smid; ioc->hpr_lookup[i].cb_idx =0xFF ;
@@ -3806,10 +3815,9 @@ _base_release_memory_pools(struct MPT3SAS_ADAPTER *ioc)if (ioc->pcie_sgl_dma_pool) {for (i =0 ; i < ioc->scsiio_depth; i++) { -if (ioc->scsi_lookup[i].pcie_sg_list.pcie_sgl) -dma_pool_free (ioc->pcie_sgl_dma_pool, - ioc->scsi_lookup[i].pcie_sg_list.pcie_sgl, - ioc->scsi_lookup[i].pcie_sg_list.pcie_sgl_dma); +dma_pool_free (ioc->pcie_sgl_dma_pool, + ioc->pcie_sg_lookup[i].pcie_sgl, + ioc->pcie_sg_lookup[i].pcie_sgl_dma); }if (ioc->pcie_sgl_dma_pool)dma_pool_destroy (ioc->pcie_sgl_dma_pool);
@@ -3823,10 +3831,6 @@ _base_release_memory_pools(struct MPT3SAS_ADAPTER *ioc) ioc->config_page, ioc->config_page_dma); } -if (ioc->scsi_lookup) { -free_pages ((ulong )ioc->scsi_lookup, ioc->scsi_lookup_pages); - ioc->scsi_lookup =NULL ; - }kfree (ioc->hpr_lookup);kfree (ioc->internal_lookup);if (ioc->chain_lookup) {
@@ -4127,16 +4131,6 @@ _base_allocate_memory_pools(struct MPT3SAS_ADAPTER *ioc) ioc->name, (unsigned long long) ioc->request_dma)); total_sz += sz; - sz = ioc->scsiio_depth *sizeof (struct scsiio_tracker ); - ioc->scsi_lookup_pages =get_order (sz); - ioc->scsi_lookup = (struct scsiio_tracker *)__get_free_pages ( -GFP_KERNEL , ioc->scsi_lookup_pages); -if (!ioc->scsi_lookup) { -pr_err (MPT3SAS_FMT "scsi_lookup: get_free_pages failed, sz(%d)\n" , - ioc->name, (int )sz); - goto out; - } -dinitprintk (ioc,pr_info (MPT3SAS_FMT "scsiio(0x%p): depth(%d)\n" , ioc->name, ioc->request, ioc->scsiio_depth));
@@ -4219,6 +4213,13 @@ _base_allocate_memory_pools(struct MPT3SAS_ADAPTER *ioc) nvme_blocks_needed /= (ioc->page_size -NVME_PRP_SIZE ); nvme_blocks_needed++; + sz =sizeof (struct pcie_sg_list ) * ioc->scsiio_depth; + ioc->pcie_sg_lookup =kzalloc (sz,GFP_KERNEL ); +if (!ioc->pcie_sg_lookup) { +pr_info (MPT3SAS_FMT +"PCIe SGL lookup: kzalloc failed\n" , ioc->name); + goto out; + } sz = nvme_blocks_needed * ioc->page_size; ioc->pcie_sgl_dma_pool =dma_pool_create ("PCIe SGL pool" , &ioc->pdev->dev, sz,16 ,0 );
@@ -4229,11 +4230,10 @@ _base_allocate_memory_pools(struct MPT3SAS_ADAPTER *ioc) goto out; }for (i =0 ; i < ioc->scsiio_depth; i++) { - ioc->scsi_lookup[i].pcie_sg_list.pcie_sgl = -dma_pool_alloc (ioc->pcie_sgl_dma_pool, -GFP_KERNEL , - &ioc->scsi_lookup[i].pcie_sg_list.pcie_sgl_dma); -if (!ioc->scsi_lookup[i].pcie_sg_list.pcie_sgl) { + ioc->pcie_sg_lookup[i].pcie_sgl =dma_pool_alloc ( + ioc->pcie_sgl_dma_pool,GFP_KERNEL , + &ioc->pcie_sg_lookup[i].pcie_sgl_dma); +if (!ioc->pcie_sg_lookup[i].pcie_sgl) {pr_info (MPT3SAS_FMT "PCIe SGL pool: dma_pool_alloc failed\n" , ioc->name);
@@ -5783,20 +5783,7 @@ _base_make_ioc_operational(struct MPT3SAS_ADAPTER *ioc)kfree (delayed_event_ack); } -/* initialize the scsi lookup free list */ spin_lock_irqsave (&ioc->scsi_lookup_lock, flags); -INIT_LIST_HEAD (&ioc->free_list); - smid =1 ; -for (i =0 ; i < ioc->scsiio_depth; i++, smid++) { -INIT_LIST_HEAD (&ioc->scsi_lookup[i].chain_list); - ioc->scsi_lookup[i].cb_idx =0xFF ; - ioc->scsi_lookup[i].smid = smid; - ioc->scsi_lookup[i].scmd =NULL ; - ioc->scsi_lookup[i].direct_io =0 ; -if (i < ioc->scsiio_depth -INTERNAL_SCSIIO_CMDS_COUNT ) -list_add_tail (&ioc->scsi_lookup[i].tracker_list, - &ioc->free_list); - }/* hi-priority queue */ INIT_LIST_HEAD (&ioc->hpr_free_list);
drivers/scsi/mpt3sas/mpt3sas_base.h +9 -16
@@ -772,20 +772,17 @@ struct chain_tracker {/** * struct scsiio_tracker - scsi mf request tracker * @smid: system message id -* @scmd: scsi request pointer * @cb_idx: callback index * @direct_io: To indicate whether I/O is direct (WARPDRIVE) -* @tracker_list: list of free request (ioc->free_list) +* @chain_list: list of associated firmware chain tracker * @msix_io: IO's msix */ struct scsiio_tracker {u16 smid; -struct scsi_cmnd *scmd;u8 cb_idx;u8 direct_io;struct pcie_sg_list pcie_sg_list;struct list_head chain_list; -struct list_head tracker_list;u16 msix_io; };
@@ -1248,10 +1245,8 @@ struct MPT3SAS_ADAPTER {u8 *request;dma_addr_t request_dma;u32 request_dma_sz; -struct scsiio_tracker *scsi_lookup; -ulong scsi_lookup_pages; +struct pcie_sg_list *pcie_sg_lookup;spinlock_t scsi_lookup_lock; -struct list_head free_list;int pending_io_count;wait_queue_head_t reset_wq;
@@ -1270,6 +1265,7 @@ struct MPT3SAS_ADAPTER {u16 chains_needed_per_io;u32 chain_depth;u16 chain_segment_sz; +u16 chains_per_prp_buffer;/* hi-priority queue */ u16 hi_priority_smid;
@@ -1401,9 +1397,9 @@ void mpt3sas_base_sync_reply_irqs(struct MPT3SAS_ADAPTER *ioc);/* hi-priority queue */ u16 mpt3sas_base_get_smid_hpr (struct MPT3SAS_ADAPTER *ioc,u8 cb_idx);u16 mpt3sas_base_get_smid_scsiio (struct MPT3SAS_ADAPTER *ioc,u8 cb_idx, -struct scsi_cmnd *scmd); -struct scsiio_tracker *mpt3sas_get_st_from_smid (struct MPT3SAS_ADAPTER *ioc, -u16 smid); +struct scsi_cmnd *scmd); +void mpt3sas_base_clear_st (struct MPT3SAS_ADAPTER *ioc, +struct scsiio_tracker *st);u16 mpt3sas_base_get_smid (struct MPT3SAS_ADAPTER *ioc,u8 cb_idx);void mpt3sas_base_free_smid (struct MPT3SAS_ADAPTER *ioc,u16 smid);
@@ -1439,6 +1435,8 @@ int mpt3sas_port_enable(struct MPT3SAS_ADAPTER *ioc);/* scsih shared API */ +struct scsi_cmnd *mpt3sas_scsih_scsi_lookup_get (struct MPT3SAS_ADAPTER *ioc, +u16 smid);u8 mpt3sas_scsih_event_callback (struct MPT3SAS_ADAPTER *ioc,u8 msix_index,u32 reply);void mpt3sas_scsih_reset_handler (struct MPT3SAS_ADAPTER *ioc,int reset_phase);
@@ -1613,14 +1611,9 @@ void mpt3sas_trigger_mpi(struct MPT3SAS_ADAPTER *ioc, u16 ioc_status,u8 mpt3sas_get_num_volumes (struct MPT3SAS_ADAPTER *ioc);void mpt3sas_init_warpdrive_properties (struct MPT3SAS_ADAPTER *ioc,struct _raid_device *raid_device); -u8 -mpt3sas_scsi_direct_io_get (struct MPT3SAS_ADAPTER *ioc,u16 smid); -void -mpt3sas_scsi_direct_io_set (struct MPT3SAS_ADAPTER *ioc,u16 smid,u8 direct_io);void mpt3sas_setup_direct_io (struct MPT3SAS_ADAPTER *ioc,struct scsi_cmnd *scmd, -struct _raid_device *raid_device,Mpi25SCSIIORequest_t *mpi_request, -u16 smid); +struct _raid_device *raid_device,Mpi25SCSIIORequest_t *mpi_request);/* NCQ Prio Handling Check */ bool scsih_ncq_prio_supp (struct scsi_device *sdev);
drivers/scsi/mpt3sas/mpt3sas_ctl.c +8 -9
@@ -567,11 +567,10 @@ _ctl_set_task_mid(struct MPT3SAS_ADAPTER *ioc, struct mpt3_ioctl_command *karg, Mpi2SCSITaskManagementRequest_t *tm_request) {u8 found =0 ; -u16 i; +u16 smid;u16 handle;struct scsi_cmnd *scmd;struct MPT3SAS_DEVICE *priv_data; -unsigned long flags;Mpi2SCSITaskManagementReply_t *tm_reply;u32 sz;u32 lun;
@@ -587,11 +586,11 @@ _ctl_set_task_mid(struct MPT3SAS_ADAPTER *ioc, struct mpt3_ioctl_command *karg, lun =scsilun_to_int ((struct scsi_lun *)tm_request->LUN); handle =le16_to_cpu (tm_request->DevHandle); -spin_lock_irqsave (&ioc->scsi_lookup_lock, flags); -for (i = ioc->scsiio_depth; i && !found; i--) { - scmd = ioc->scsi_lookup[i -1 ].scmd; -if (scmd ==NULL || scmd->device ==NULL || - scmd->device->hostdata ==NULL ) +for (smid = ioc->scsiio_depth; smid && !found; smid--) { +struct scsiio_tracker *st; + + scmd =mpt3sas_scsih_scsi_lookup_get (ioc, smid); +if (!scmd)continue ;if (lun != scmd->device->lun)continue ;
@@ -600,10 +599,10 @@ _ctl_set_task_mid(struct MPT3SAS_ADAPTER *ioc, struct mpt3_ioctl_command *karg,continue ;if (priv_data->sas_target->handle != handle)continue ; - tm_request->TaskMID =cpu_to_le16 (ioc->scsi_lookup[i -1 ].smid); + st =scsi_cmd_priv (scmd); + tm_request->TaskMID =cpu_to_le16 (st->smid); found =1 ; } -spin_unlock_irqrestore (&ioc->scsi_lookup_lock, flags);if (!found) { dctlprintk(ioc, pr_info(MPT3SAS_FMT
drivers/scsi/mpt3sas/mpt3sas_scsih.c +37 -84
239 lines not on this page · raw message
drivers/scsi/mpt3sas/mpt3sas_warpdrive.c +3 -32
@@ -261,35 +261,6 @@ out_error: }/** -* mpt3sas_scsi_direct_io_get - returns direct io flag -* @ioc: per adapter object -* @smid: system request message index -* -* Returns the smid stored scmd pointer. -*/ -inline u8 -mpt3sas_scsi_direct_io_get (struct MPT3SAS_ADAPTER *ioc,u16 smid) -{ -struct scsiio_tracker *st =mpt3sas_get_st_from_smid (ioc, smid); - -return st ? st->direct_io :0 ; -} - -/** -* mpt3sas_scsi_direct_io_set - sets direct io flag -* @ioc: per adapter object -* @smid: system request message index -* @direct_io: Zero or non-zero value to set in the direct_io flag -* -* Returns Nothing. -*/ -inline void -mpt3sas_scsi_direct_io_set (struct MPT3SAS_ADAPTER *ioc,u16 smid,u8 direct_io) -{ - ioc->scsi_lookup[smid -1 ].direct_io = direct_io; -} - -/** * mpt3sas_setup_direct_io - setup MPI request for WARPDRIVE Direct I/O * @ioc: per adapter object * @scmd: pointer to scsi command object
@@ -301,12 +272,12 @@ mpt3sas_scsi_direct_io_set(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 direct_io)*/ void mpt3sas_setup_direct_io (struct MPT3SAS_ADAPTER *ioc,struct scsi_cmnd *scmd, -struct _raid_device *raid_device,Mpi25SCSIIORequest_t *mpi_request, -u16 smid) +struct _raid_device *raid_device,Mpi25SCSIIORequest_t *mpi_request) {sector_t v_lba, p_lba, stripe_off, column, io_size;u32 stripe_sz, stripe_exp;u8 num_pds, cmd = scmd->cmnd[0 ]; +struct scsiio_tracker *st =scsi_cmd_priv (scmd);if (cmd !=READ_10 && cmd !=WRITE_10 && cmd !=READ_16 && cmd !=WRITE_16 )
@@ -342,5 +313,5 @@ mpt3sas_setup_direct_io(struct MPT3SAS_ADAPTER *ioc, struct scsi_cmnd *scmd,else put_unaligned_be64 (p_lba, &mpi_request->CDB.CDB32[2 ]); -mpt3sas_scsi_direct_io_set (ioc, smid,1 ); + st->direct_io =1 ; }
Signature · 1 line
2.5.5
Martin K. Petersen
Appliedcover mpt3sas: Enable scsi MQ & lockless command submission
In reply to Suganath Prabu SSuganath,
Quoted 5 lines
This patch set is initially posted by Hannes Reinecke to enable scsi multiqueue for the mpt3sas driver. While the HBA only has a single mailbox register for submitting commands, it does have individual receive queues per MSI-X interrupt and as such does benefit from converting it to full multiqueue support.
Applied to 4.16/scsi-queue. Thank you!
Signature · 1 line
Martin K. Petersen Oracle Linux Engineering