scsi: mpt3sas: lockless command submission
Performance 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. Signed-off-by: Hannes Reinecke <hare@suse.com> Signed-off-by: Suganath Prabu S <suganath-prabu.subramani@broadcom.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
此提交包含在:

提交者
Martin K. Petersen

父節點
272e253c7b
當前提交
dbec4c9040
@@ -260,35 +260,6 @@ out_error:
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
@@ -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;
|
||||
}
|
||||
|
新增問題並參考
封鎖使用者