Message ID | 20210419110156.1786882-15-kashyap.desai@broadcom.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Introducing mpi3mr driver | expand |
> On Apr 19, 2021, at 6:01 AM, Kashyap Desai <kashyap.desai@broadcom.com> wrote: > > Signed-off-by: Kashyap Desai <kashyap.desai@broadcom.com> > Reviewed-by: Hannes Reinecke <hare@suse.de> > Reviewed-by: Tomas Henzl <thenzl@redhat.com> > > Cc: sathya.prakash@broadcom.com > --- > drivers/scsi/mpi3mr/mpi3mr.h | 3 +++ > drivers/scsi/mpi3mr/mpi3mr_os.c | 35 ++++++++++++++++++++++++++++++++- > 2 files changed, 37 insertions(+), 1 deletion(-) > > diff --git a/drivers/scsi/mpi3mr/mpi3mr.h b/drivers/scsi/mpi3mr/mpi3mr.h > index fe6c815b918a..e3ce54f877fa 100644 > --- a/drivers/scsi/mpi3mr/mpi3mr.h > +++ b/drivers/scsi/mpi3mr/mpi3mr.h > @@ -141,6 +141,9 @@ extern struct list_head mrioc_list; > /* Command retry count definitions */ > #define MPI3MR_DEV_RMHS_RETRY_COUNT 3 > > +/* Default target device queue depth */ > +#define MPI3MR_DEFAULT_SDEV_QD 32 > + > /* SGE Flag definition */ > #define MPI3MR_SGEFLAGS_SYSTEM_SIMPLE_END_OF_LIST \ > (MPI3_SGE_FLAGS_ELEMENT_TYPE_SIMPLE | MPI3_SGE_FLAGS_DLAS_SYSTEM | \ > diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c > index fd5fdc61169e..99a60e6777d5 100644 > --- a/drivers/scsi/mpi3mr/mpi3mr_os.c > +++ b/drivers/scsi/mpi3mr/mpi3mr_os.c > @@ -649,6 +649,34 @@ static int mpi3mr_report_tgtdev_to_host(struct mpi3mr_ioc *mrioc, > return retval; > } > > +/** > + * mpi3mr_change_queue_depth- Change QD callback handler > + * @sdev: SCSI device reference > + * @q_depth: Queue depth > + * > + * Validate and limit QD and call scsi_change_queue_depth. > + * > + * Return: return value of scsi_change_queue_depth > + */ > +static int mpi3mr_change_queue_depth(struct scsi_device *sdev, > + int q_depth) > +{ > + struct scsi_target *starget = scsi_target(sdev); > + struct Scsi_Host *shost = dev_to_shost(&starget->dev); > + int retval = 0; > + > + if (!sdev->tagged_supported) > + q_depth = 1; > + if (q_depth > shost->can_queue) > + q_depth = shost->can_queue; > + else if (!q_depth) > + q_depth = MPI3MR_DEFAULT_SDEV_QD; > + retval = scsi_change_queue_depth(sdev, q_depth); > + > + return retval; > +} > + > + > /** > * mpi3mr_update_sdev - Update SCSI device information > * @sdev: SCSI device reference > @@ -669,6 +697,7 @@ mpi3mr_update_sdev(struct scsi_device *sdev, void *data) > if (!tgtdev) > return; > > + mpi3mr_change_queue_depth(sdev, tgtdev->q_depth); > switch (tgtdev->dev_type) { > case MPI3_DEVICE_DEVFORM_PCIE: > /*The block layer hw sector size = 512*/ > @@ -2650,9 +2679,12 @@ static int mpi3mr_slave_configure(struct scsi_device *sdev) > spin_lock_irqsave(&mrioc->tgtdev_lock, flags); > tgt_dev = __mpi3mr_get_tgtdev_by_perst_id(mrioc, starget->id); > spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags); > - if (!tgt_dev) > + if (!tgt_dev) { > + mpi3mr_change_queue_depth(sdev, MPI3MR_DEFAULT_SDEV_QD); > return retval; > + } > > + mpi3mr_change_queue_depth(sdev, tgt_dev->q_depth); > switch (tgt_dev->dev_type) { > case MPI3_DEVICE_DEVFORM_PCIE: > /*The block layer hw sector size = 512*/ > @@ -2892,6 +2924,7 @@ static struct scsi_host_template mpi3mr_driver_template = { > .slave_destroy = mpi3mr_slave_destroy, > .scan_finished = mpi3mr_scan_finished, > .scan_start = mpi3mr_scan_start, > + .change_queue_depth = mpi3mr_change_queue_depth, > .eh_device_reset_handler = mpi3mr_eh_dev_reset, > .eh_target_reset_handler = mpi3mr_eh_target_reset, > .eh_host_reset_handler = mpi3mr_eh_host_reset, > -- > 2.18.1 > Looks Good. Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com> -- Himanshu Madhani Oracle Linux Engineering
diff --git a/drivers/scsi/mpi3mr/mpi3mr.h b/drivers/scsi/mpi3mr/mpi3mr.h index fe6c815b918a..e3ce54f877fa 100644 --- a/drivers/scsi/mpi3mr/mpi3mr.h +++ b/drivers/scsi/mpi3mr/mpi3mr.h @@ -141,6 +141,9 @@ extern struct list_head mrioc_list; /* Command retry count definitions */ #define MPI3MR_DEV_RMHS_RETRY_COUNT 3 +/* Default target device queue depth */ +#define MPI3MR_DEFAULT_SDEV_QD 32 + /* SGE Flag definition */ #define MPI3MR_SGEFLAGS_SYSTEM_SIMPLE_END_OF_LIST \ (MPI3_SGE_FLAGS_ELEMENT_TYPE_SIMPLE | MPI3_SGE_FLAGS_DLAS_SYSTEM | \ diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c index fd5fdc61169e..99a60e6777d5 100644 --- a/drivers/scsi/mpi3mr/mpi3mr_os.c +++ b/drivers/scsi/mpi3mr/mpi3mr_os.c @@ -649,6 +649,34 @@ static int mpi3mr_report_tgtdev_to_host(struct mpi3mr_ioc *mrioc, return retval; } +/** + * mpi3mr_change_queue_depth- Change QD callback handler + * @sdev: SCSI device reference + * @q_depth: Queue depth + * + * Validate and limit QD and call scsi_change_queue_depth. + * + * Return: return value of scsi_change_queue_depth + */ +static int mpi3mr_change_queue_depth(struct scsi_device *sdev, + int q_depth) +{ + struct scsi_target *starget = scsi_target(sdev); + struct Scsi_Host *shost = dev_to_shost(&starget->dev); + int retval = 0; + + if (!sdev->tagged_supported) + q_depth = 1; + if (q_depth > shost->can_queue) + q_depth = shost->can_queue; + else if (!q_depth) + q_depth = MPI3MR_DEFAULT_SDEV_QD; + retval = scsi_change_queue_depth(sdev, q_depth); + + return retval; +} + + /** * mpi3mr_update_sdev - Update SCSI device information * @sdev: SCSI device reference @@ -669,6 +697,7 @@ mpi3mr_update_sdev(struct scsi_device *sdev, void *data) if (!tgtdev) return; + mpi3mr_change_queue_depth(sdev, tgtdev->q_depth); switch (tgtdev->dev_type) { case MPI3_DEVICE_DEVFORM_PCIE: /*The block layer hw sector size = 512*/ @@ -2650,9 +2679,12 @@ static int mpi3mr_slave_configure(struct scsi_device *sdev) spin_lock_irqsave(&mrioc->tgtdev_lock, flags); tgt_dev = __mpi3mr_get_tgtdev_by_perst_id(mrioc, starget->id); spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags); - if (!tgt_dev) + if (!tgt_dev) { + mpi3mr_change_queue_depth(sdev, MPI3MR_DEFAULT_SDEV_QD); return retval; + } + mpi3mr_change_queue_depth(sdev, tgt_dev->q_depth); switch (tgt_dev->dev_type) { case MPI3_DEVICE_DEVFORM_PCIE: /*The block layer hw sector size = 512*/ @@ -2892,6 +2924,7 @@ static struct scsi_host_template mpi3mr_driver_template = { .slave_destroy = mpi3mr_slave_destroy, .scan_finished = mpi3mr_scan_finished, .scan_start = mpi3mr_scan_start, + .change_queue_depth = mpi3mr_change_queue_depth, .eh_device_reset_handler = mpi3mr_eh_dev_reset, .eh_target_reset_handler = mpi3mr_eh_target_reset, .eh_host_reset_handler = mpi3mr_eh_host_reset,