[PATCH] nvme-fc: shorten reconnect delay if possible for FC

Himanshu Madhani himanshu.madhani at oracle.com
Mon Oct 19 10:59:51 EDT 2020



> On Oct 16, 2020, at 4:29 PM, James Smart <james.smart at broadcom.com> wrote:
> 
> We've had several complaints about a 10s reconnect delay (the default)
> when there was an error while there is connectivity to a subsystem.
> The max_reconnects and reconnect_delay are set in common code prior to
> calling the transport to create the controller.
> 
> This change checks if the default reconnect delay is being used, and if
> so, it adjusts it to a shorter period (2s) for the nvme-fc transport.
> It does so by calculating the controller loss tmo window, changing the
> value of the reconnect delay, and then recalculating the maximum number
> of reconnect attempts allowed.
> 
> Signed-off-by: James Smart <james.smart at broadcom.com>
> ---
> drivers/nvme/host/fc.c | 19 ++++++++++++++++++-
> 1 file changed, 18 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c
> index 6352068c0c4a..1af7c6f358f5 100644
> --- a/drivers/nvme/host/fc.c
> +++ b/drivers/nvme/host/fc.c
> @@ -26,6 +26,10 @@ enum nvme_fc_queue_flags {
> };
> 
> #define NVME_FC_DEFAULT_DEV_LOSS_TMO	60	/* seconds */
> +#define NVME_FC_DEFAULT_RECONNECT_TMO	2	/* delay between reconnects
> +						 * when connected and a
> +						 * connection failure.
> +						 */
> 
> struct nvme_fc_queue {
> 	struct nvme_fc_ctrl	*ctrl;
> @@ -3387,7 +3391,7 @@ nvme_fc_init_ctrl(struct device *dev, struct nvmf_ctrl_options *opts,
> {
> 	struct nvme_fc_ctrl *ctrl;
> 	unsigned long flags;
> -	int ret, idx;
> +	int ret, idx, ctrl_loss_tmo;
> 
> 	if (!(rport->remoteport.port_role &
> 	    (FC_PORT_ROLE_NVME_DISCOVERY | FC_PORT_ROLE_NVME_TARGET))) {
> @@ -3413,6 +3417,19 @@ nvme_fc_init_ctrl(struct device *dev, struct nvmf_ctrl_options *opts,
> 		goto out_free_ctrl;
> 	}
> 
> +	/*
> +	 * if ctrl_loss_tmo is being enforced and the default reconnect delay
> +	 * is being used, change to a shorter reconnect delay for FC.
> +	 */
> +	if (opts->max_reconnects != -1 &&
> +	    opts->reconnect_delay == NVMF_DEF_RECONNECT_DELAY &&
> +	    opts->reconnect_delay > NVME_FC_DEFAULT_RECONNECT_TMO) {
> +		ctrl_loss_tmo = opts->max_reconnects * opts->reconnect_delay;
> +		opts->reconnect_delay = NVME_FC_DEFAULT_RECONNECT_TMO;
> +		opts->max_reconnects = DIV_ROUND_UP(ctrl_loss_tmo,
> +						opts->reconnect_delay);
> +	}
> +
> 	ctrl->ctrl.opts = opts;
> 	ctrl->ctrl.nr_reconnects = 0;
> 	if (lport->dev)
> -- 
> 2.26.2
> 
> _______________________________________________
> Linux-nvme mailing list
> Linux-nvme at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-nvme

Looks good.

Reviewed-by: Himanshu Madhani <himanshu.madhani at oracle.com>

--
Himanshu Madhani	 Oracle Linux Engineering




More information about the Linux-nvme mailing list