[PATCH v3 3/5] nvme_fc: add a dev_loss_tmo field to the remoteport

Hannes Reinecke hare at suse.de
Thu Oct 19 23:04:02 PDT 2017


On 10/18/2017 01:32 AM, James Smart wrote:
> Add a dev_loss_tmo value, paralleling the SCSI FC transport, for device
> connectivity loss.
> 
> The transport initializes the value in the nvme_fc_register_remoteport()
> call. If the value is not set, a default of 60s is set.
> 
> Add a new routine to the api, nvme_fc_set_remoteport_devloss() routine,
> which allows the lldd to dynamically update the value on an existing
> remoteport.
> 
> Signed-off-by: James Smart <james.smart at broadcom.com>
> 
> ---
> v3:
>  Removed the expected reconnect time and min devloss defines. They
>  were not that meaningful.
>  Incorporated the new nvme_fc_set_remoteport_devloss() routine
>  which was in a different patch in v2. New routine no longer
>  touches controllers. It only modifies the remoteport.
> ---
>  drivers/nvme/host/fc.c         | 31 +++++++++++++++++++++++++++++++
>  include/linux/nvme-fc-driver.h | 11 +++++++++--
>  2 files changed, 40 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c
> index 5afb518c39ad..3ac49e670c38 100644
> --- a/drivers/nvme/host/fc.c
> +++ b/drivers/nvme/host/fc.c
> @@ -45,6 +45,8 @@ enum nvme_fc_queue_flags {
>  
>  #define NVMEFC_QUEUE_DELAY	3		/* ms units */
>  
> +#define NVME_FC_DEFAULT_DEV_LOSS_TMO	60	/* seconds */
> +
>  struct nvme_fc_queue {
>  	struct nvme_fc_ctrl	*ctrl;
>  	struct device		*dev;
> @@ -587,6 +589,11 @@ nvme_fc_register_remoteport(struct nvme_fc_local_port *localport,
>  	newrec->remoteport.port_id = pinfo->port_id;
>  	newrec->remoteport.port_state = FC_OBJSTATE_ONLINE;
>  	newrec->remoteport.port_num = idx;
> +	/* a registration value of dev_loss_tmo=0 results in the default */
> +	if (pinfo->dev_loss_tmo)
> +		newrec->remoteport.dev_loss_tmo = pinfo->dev_loss_tmo;
> +	else
> +		newrec->remoteport.dev_loss_tmo = NVME_FC_DEFAULT_DEV_LOSS_TMO;
>  
>  	spin_lock_irqsave(&nvme_fc_lock, flags);
>  	list_add_tail(&newrec->endp_list, &lport->endp_list);
> @@ -690,6 +697,30 @@ nvme_fc_rescan_remoteport(struct nvme_fc_remote_port *remoteport)
>  }
>  EXPORT_SYMBOL_GPL(nvme_fc_rescan_remoteport);
>  
> +int
> +nvme_fc_set_remoteport_devloss(struct nvme_fc_remote_port *portptr,
> +			u32 dev_loss_tmo)
> +{
> +	struct nvme_fc_rport *rport = remoteport_to_rport(portptr);
> +	struct nvme_fc_ctrl *ctrl;
> +	unsigned long flags;
> +
> +	spin_lock_irqsave(&rport->lock, flags);
> +
> +	if (portptr->port_state != FC_OBJSTATE_ONLINE) {
> +		spin_unlock_irqrestore(&rport->lock, flags);
> +		return -EINVAL;
> +	}
> +
> +	/* a dev_loss_tmo of 0 (immediate) is allowed to be set */
> +	rport->remoteport.dev_loss_tmo = dev_loss_tmo;
> +
> +	spin_unlock_irqrestore(&rport->lock, flags);
> +
> +	return 0;
> +}
> +EXPORT_SYMBOL_GPL(nvme_fc_set_remoteport_devloss);
> +
>  
>  /* *********************** FC-NVME DMA Handling **************************** */
>  
> diff --git a/include/linux/nvme-fc-driver.h b/include/linux/nvme-fc-driver.h
> index 4ea03b9a5c8c..3de268bf86bf 100644
> --- a/include/linux/nvme-fc-driver.h
> +++ b/include/linux/nvme-fc-driver.h
> @@ -40,6 +40,8 @@
>   * @node_name: FC WWNN for the port
>   * @port_name: FC WWPN for the port
>   * @port_role: What NVME roles are supported (see FC_PORT_ROLE_xxx)
> + * @dev_loss_tmo: maximum delay for reconnects to an association on
> + *             this device. Used only on a remoteport.
>   *
>   * Initialization values for dynamic port fields:
>   * @port_id:      FC N_Port_ID currently assigned the port. Upper 8 bits must
> @@ -50,6 +52,7 @@ struct nvme_fc_port_info {
>  	u64			port_name;
>  	u32			port_role;
>  	u32			port_id;
> +	u32			dev_loss_tmo;
>  };
>  
>  
> @@ -202,6 +205,9 @@ enum nvme_fc_obj_state {
>   *             The length of the buffer corresponds to the local_priv_sz
>   *             value specified in the nvme_fc_port_template supplied by
>   *             the LLDD.
> + * @dev_loss_tmo: maximum delay for reconnects to an association on
> + *             this device. To modify, lldd must call
> + *             nvme_fc_set_remoteport_devloss().
>   *
>   * Fields with dynamic values. Values may change base on link state. LLDD
>   * may reference fields directly to change them. Initialized by the
> @@ -259,10 +265,9 @@ struct nvme_fc_remote_port {
>  	u32 port_role;
>  	u64 node_name;
>  	u64 port_name;
> -
>  	struct nvme_fc_local_port *localport;
> -
>  	void *private;
> +	u32 dev_loss_tmo;
>  
>  	/* dynamic fields */
>  	u32 port_id;
> @@ -448,6 +453,8 @@ int nvme_fc_unregister_remoteport(struct nvme_fc_remote_port *remoteport);
>  
>  void nvme_fc_rescan_remoteport(struct nvme_fc_remote_port *remoteport);
>  
> +int nvme_fc_set_remoteport_devloss(struct nvme_fc_remote_port *remoteport,
> +			u32 dev_loss_tmo);
>  
>  
>  /*
> 
Is this exported to sysfs somewhere? If not, can we have it in sysfs?
It surely made live _so_ much easier when configuring the odd device...

Other than that:

Reviewed-by: Hannes Reinecke <hare at suse.com>

Cheers,

Hannes
-- 
Dr. Hannes Reinecke		   Teamlead Storage & Networking
hare at suse.de			               +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)



More information about the Linux-nvme mailing list