On Wed, Feb 22, 2017 at 4:01 PM, Hannes Reinecke <h...@suse.de> wrote:
> Use 'host_busy' instead of counting outstanding commands by hand.
>
> Suggested-by: Christoph Hellwig <h...@lst.de>
> Signed-off-by: Hannes Reinecke <h...@suse.com>
> ---
>  drivers/scsi/mpt3sas/mpt3sas_base.c | 14 ++++----------
>  1 file changed, 4 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c 
> b/drivers/scsi/mpt3sas/mpt3sas_base.c
> index e6aafa5..169d185 100644
> --- a/drivers/scsi/mpt3sas/mpt3sas_base.c
> +++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
> @@ -2408,9 +2408,9 @@ struct scsiio_tracker *
>          * 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);

This won't consider the scsi IO issued from ioctl path. If that scsi
io is still outstanding then here we will return without waiting for
it to complete.

> +               if (ioc->pending_io_count == 0)
>                         wake_up(&ioc->reset_wq);
> -               ioc->pending_io_count--;
>         }
>  }
>
> @@ -5687,15 +5687,13 @@ struct scsiio_tracker *
>   * _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;
>
> @@ -5704,11 +5702,7 @@ struct scsiio_tracker *
>                 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;
> --
> 1.8.5.6
>

Reply via email to