Commit 459325c4 authored by Chaitra P B's avatar Chaitra P B Committed by Martin K. Petersen

scsi: mpt3sas: Fix for Crusader to achieve product targets with SAS devices.

Small glitch/degraded performance in Crusader is improved with SAS
drives by removing unnecessary spinlocks while clearing scsi command in
drivers internal lookup table.
Signed-off-by: default avatarChaitra P B <chaitra.basappa@broadcom.com>
Signed-off-by: default avatarSuganath Prabu S <suganath-prabu.subramani@broadcom.com>
Reviewed-by: default avatarJohannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 6c44c0fe
...@@ -5522,6 +5522,7 @@ mpt3sas_base_attach(struct MPT3SAS_ADAPTER *ioc) ...@@ -5522,6 +5522,7 @@ mpt3sas_base_attach(struct MPT3SAS_ADAPTER *ioc)
goto out_free_resources; goto out_free_resources;
ioc->non_operational_loop = 0; ioc->non_operational_loop = 0;
ioc->got_task_abort_from_ioctl = 0;
return 0; return 0;
out_free_resources: out_free_resources:
......
...@@ -988,6 +988,7 @@ struct MPT3SAS_ADAPTER { ...@@ -988,6 +988,7 @@ struct MPT3SAS_ADAPTER {
u8 broadcast_aen_busy; u8 broadcast_aen_busy;
u16 broadcast_aen_pending; u16 broadcast_aen_pending;
u8 shost_recovery; u8 shost_recovery;
u8 got_task_abort_from_ioctl;
struct mutex reset_in_progress_mutex; struct mutex reset_in_progress_mutex;
spinlock_t ioc_reset_in_progress_lock; spinlock_t ioc_reset_in_progress_lock;
......
...@@ -826,16 +826,18 @@ _ctl_do_mpt_command(struct MPT3SAS_ADAPTER *ioc, struct mpt3_ioctl_command karg, ...@@ -826,16 +826,18 @@ _ctl_do_mpt_command(struct MPT3SAS_ADAPTER *ioc, struct mpt3_ioctl_command karg,
"TASK_MGMT: handle(0x%04x), task_type(0x%02x)\n", "TASK_MGMT: handle(0x%04x), task_type(0x%02x)\n",
ioc->name, ioc->name,
le16_to_cpu(tm_request->DevHandle), tm_request->TaskType)); le16_to_cpu(tm_request->DevHandle), tm_request->TaskType));
ioc->got_task_abort_from_ioctl = 1;
if (tm_request->TaskType == if (tm_request->TaskType ==
MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK || MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK ||
tm_request->TaskType == tm_request->TaskType ==
MPI2_SCSITASKMGMT_TASKTYPE_QUERY_TASK) { MPI2_SCSITASKMGMT_TASKTYPE_QUERY_TASK) {
if (_ctl_set_task_mid(ioc, &karg, tm_request)) { if (_ctl_set_task_mid(ioc, &karg, tm_request)) {
mpt3sas_base_free_smid(ioc, smid); mpt3sas_base_free_smid(ioc, smid);
ioc->got_task_abort_from_ioctl = 0;
goto out; goto out;
} }
} }
ioc->got_task_abort_from_ioctl = 0;
if (test_bit(device_handle, ioc->device_remove_in_progress)) { if (test_bit(device_handle, ioc->device_remove_in_progress)) {
dtmprintk(ioc, pr_info(MPT3SAS_FMT dtmprintk(ioc, pr_info(MPT3SAS_FMT
......
...@@ -1073,6 +1073,26 @@ _scsih_scsi_lookup_get(struct MPT3SAS_ADAPTER *ioc, u16 smid) ...@@ -1073,6 +1073,26 @@ _scsih_scsi_lookup_get(struct MPT3SAS_ADAPTER *ioc, u16 smid)
return ioc->scsi_lookup[smid - 1].scmd; return ioc->scsi_lookup[smid - 1].scmd;
} }
/**
* __scsih_scsi_lookup_get_clear - returns scmd entry without
* holding any lock.
* @ioc: per adapter object
* @smid: system request message index
*
* Returns the smid stored scmd pointer.
* Then will dereference the stored scmd pointer.
*/
static inline struct scsi_cmnd *
__scsih_scsi_lookup_get_clear(struct MPT3SAS_ADAPTER *ioc,
u16 smid)
{
struct scsi_cmnd *scmd = NULL;
swap(scmd, ioc->scsi_lookup[smid - 1].scmd);
return scmd;
}
/** /**
* _scsih_scsi_lookup_get_clear - returns scmd entry * _scsih_scsi_lookup_get_clear - returns scmd entry
* @ioc: per adapter object * @ioc: per adapter object
...@@ -1088,8 +1108,7 @@ _scsih_scsi_lookup_get_clear(struct MPT3SAS_ADAPTER *ioc, u16 smid) ...@@ -1088,8 +1108,7 @@ _scsih_scsi_lookup_get_clear(struct MPT3SAS_ADAPTER *ioc, u16 smid)
struct scsi_cmnd *scmd; struct scsi_cmnd *scmd;
spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
scmd = ioc->scsi_lookup[smid - 1].scmd; scmd = __scsih_scsi_lookup_get_clear(ioc, smid);
ioc->scsi_lookup[smid - 1].scmd = NULL;
spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags);
return scmd; return scmd;
...@@ -4646,7 +4665,13 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply) ...@@ -4646,7 +4665,13 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
unsigned long flags; unsigned long flags;
mpi_reply = mpt3sas_base_get_reply_virt_addr(ioc, reply); mpi_reply = mpt3sas_base_get_reply_virt_addr(ioc, reply);
scmd = _scsih_scsi_lookup_get_clear(ioc, smid);
if (ioc->broadcast_aen_busy || ioc->pci_error_recovery ||
ioc->got_task_abort_from_ioctl)
scmd = _scsih_scsi_lookup_get_clear(ioc, smid);
else
scmd = __scsih_scsi_lookup_get_clear(ioc, smid);
if (scmd == NULL) if (scmd == NULL)
return 1; return 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment