Re: [PATCH v3 20/24] mpi3mr: wait for pending IO completions upon detection of VD IO timeout

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> On Apr 19, 2021, at 6:01 AM, Kashyap Desai <kashyap.desai@xxxxxxxxxxxx> wrote:
> 
> Wait for (default 180 seconds) host IO completion if IO timeout is detected
> on VDs
> 
> Signed-off-by: Kashyap Desai <kashyap.desai@xxxxxxxxxxxx>
> Reviewed-by: Hannes Reinecke <hare@xxxxxxx>
> Reviewed-by: Tomas Henzl <thenzl@xxxxxxxxxx>
> 
> Cc: sathya.prakash@xxxxxxxxxxxx
> ---
> drivers/scsi/mpi3mr/mpi3mr.h    |  1 +
> drivers/scsi/mpi3mr/mpi3mr_fw.c |  2 ++
> drivers/scsi/mpi3mr/mpi3mr_os.c | 53 +++++++++++++++++++++++++++++++++
> 3 files changed, 56 insertions(+)
> 
> diff --git a/drivers/scsi/mpi3mr/mpi3mr.h b/drivers/scsi/mpi3mr/mpi3mr.h
> index ff3e68a6d0b5..505df0e7b852 100644
> --- a/drivers/scsi/mpi3mr/mpi3mr.h
> +++ b/drivers/scsi/mpi3mr/mpi3mr.h
> @@ -102,6 +102,7 @@ extern struct list_head mrioc_list;
> #define MPI3MR_RESET_HOST_IOWAIT_TIMEOUT	5
> #define MPI3MR_TSUPDATE_INTERVAL		900
> #define MPI3MR_DEFAULT_SHUTDOWN_TIME		120
> +#define	MPI3MR_RAID_ERRREC_RESET_TIMEOUT	180
> 
> #define MPI3MR_WATCHDOG_INTERVAL		1000 /* in milli seconds */
> 
> diff --git a/drivers/scsi/mpi3mr/mpi3mr_fw.c b/drivers/scsi/mpi3mr/mpi3mr_fw.c
> index bb1d2c45e903..488fc3eac9dc 100644
> --- a/drivers/scsi/mpi3mr/mpi3mr_fw.c
> +++ b/drivers/scsi/mpi3mr/mpi3mr_fw.c
> @@ -3779,6 +3779,8 @@ int mpi3mr_soft_reset_handler(struct mpi3mr_ioc *mrioc,
> 		}
> 	}
> 
> +	mpi3mr_wait_for_host_io(mrioc, MPI3MR_RESET_HOST_IOWAIT_TIMEOUT);
> +
> 	mpi3mr_ioc_disable_intr(mrioc);
> 
> 	if (snapdump) {
> diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c
> index 56f1e59e86cc..ccee3e7359ec 100644
> --- a/drivers/scsi/mpi3mr/mpi3mr_os.c
> +++ b/drivers/scsi/mpi3mr/mpi3mr_os.c
> @@ -2435,6 +2435,43 @@ static void mpi3mr_print_pending_host_io(struct mpi3mr_ioc *mrioc)
> 	    mpi3mr_print_scmd, (void *)mrioc);
> }
> 
> +/**
> + * mpi3mr_wait_for_host_io - block for I/Os to complete
> + * @mrioc: Adapter instance reference
> + * @timeout: time out in seconds
> + * Waits for pending I/Os for the given adapter to complete or
> + * to hit the timeout.
> + *
> + * Return: Nothing
> + */
> +void mpi3mr_wait_for_host_io(struct mpi3mr_ioc *mrioc, u32 timeout)
> +{
> +	enum mpi3mr_iocstate iocstate;
> +	int i = 0;
> +
> +	iocstate = mpi3mr_get_iocstate(mrioc);
> +	if (iocstate != MRIOC_STATE_READY)
> +		return;
> +
> +	if (!mpi3mr_get_fw_pending_ios(mrioc))
> +		return;
> +	ioc_info(mrioc,
> +	    "%s :Waiting for %d seconds prior to reset for %d I/O\n",
> +	    __func__, timeout, mpi3mr_get_fw_pending_ios(mrioc));
> +
> +	for (i = 0; i < timeout; i++) {
> +		if (!mpi3mr_get_fw_pending_ios(mrioc))
> +			break;
> +		iocstate = mpi3mr_get_iocstate(mrioc);
> +		if (iocstate != MRIOC_STATE_READY)
> +			break;
> +		msleep(1000);
> +	}
> +
> +	ioc_info(mrioc, "%s :Pending I/Os after wait is: %d\n", __func__,
> +	    mpi3mr_get_fw_pending_ios(mrioc));
> +}
> +
> /**
>  * mpi3mr_eh_host_reset - Host reset error handling callback
>  * @scmd: SCSI command reference
> @@ -2449,9 +2486,25 @@ static void mpi3mr_print_pending_host_io(struct mpi3mr_ioc *mrioc)
> static int mpi3mr_eh_host_reset(struct scsi_cmnd *scmd)
> {
> 	struct mpi3mr_ioc *mrioc = shost_priv(scmd->device->host);
> +	struct mpi3mr_stgt_priv_data *stgt_priv_data;
> +	struct mpi3mr_sdev_priv_data *sdev_priv_data;
> +	u8 dev_type = MPI3_DEVICE_DEVFORM_VD;
> 	int retval = FAILED, ret;
> 
> +	sdev_priv_data = scmd->device->hostdata;
> +	if (sdev_priv_data && sdev_priv_data->tgt_priv_data) {
> +		stgt_priv_data = sdev_priv_data->tgt_priv_data;
> +		dev_type = stgt_priv_data->dev_type;
> +	}
> 
> +	if (dev_type == MPI3_DEVICE_DEVFORM_VD) {
> +		mpi3mr_wait_for_host_io(mrioc,
> +		    MPI3MR_RAID_ERRREC_RESET_TIMEOUT);
> +		if (!mpi3mr_get_fw_pending_ios(mrioc)) {
> +			retval = SUCCESS;
> +			goto out;
> +		}
> +	}
> 	mpi3mr_print_pending_host_io(mrioc);
> 	ret = mpi3mr_soft_reset_handler(mrioc,
> 	    MPI3MR_RESET_FROM_EH_HOS, 1);
> -- 
> 2.18.1
> 

Reviewed-by: Himanshu Madhani <himanshu.madhani@xxxxxxxxxx>

--
Himanshu Madhani	 Oracle Linux Engineering





[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux