From mboxrd@z Thu Jan 1 00:00:00 1970 From: jsmart2021@gmail.com (jsmart2021@gmail.com) Date: Thu, 4 May 2017 11:07:32 -0700 Subject: [RFC 2/7] nvme_fc: add a dev_loss_tmo field to the remoteport In-Reply-To: <20170504180737.5472-1-jsmart2021@gmail.com> References: <20170504180737.5472-1-jsmart2021@gmail.com> Message-ID: <20170504180737.5472-3-jsmart2021@gmail.com> From: James Smart Add a dev_loss_tmo value, paralleling the SCSI FC transport, for device connectivity loss. The transport can initialize it in the nvme_fc_register_remoteport() call or fall back on a default of 60s. Signed-off-by: James Smart --- drivers/nvme/host/fc.c | 14 ++++++++++++++ include/linux/nvme-fc-driver.h | 9 +++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c index ac7e8145e5ec..89a5aa3c8cd9 100644 --- a/drivers/nvme/host/fc.c +++ b/drivers/nvme/host/fc.c @@ -45,6 +45,10 @@ enum nvme_fc_queue_flags { #define NVMEFC_QUEUE_DELAY 3 /* ms units */ +#define NVME_FC_DEFAULT_DEV_LOSS_TMO 60 /* seconds */ +#define NVME_FC_EXPECTED_RECONNECT_TM 2 /* seconds - E_D_TOV */ +#define NVME_FC_MIN_DEV_LOSS_TMO (2 * NVME_FC_EXPECTED_RECONNECT_TM) + struct nvme_fc_queue { struct nvme_fc_ctrl *ctrl; struct device *dev; @@ -415,6 +419,12 @@ nvme_fc_register_remoteport(struct nvme_fc_local_port *localport, unsigned long flags; int ret, idx; + if (pinfo->dev_loss_tmo && + pinfo->dev_loss_tmo < NVME_FC_MIN_DEV_LOSS_TMO) { + ret = -EINVAL; + goto out_reghost_failed; + } + newrec = kmalloc((sizeof(*newrec) + lport->ops->remote_priv_sz), GFP_KERNEL); if (!newrec) { @@ -448,6 +458,10 @@ 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; + 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); diff --git a/include/linux/nvme-fc-driver.h b/include/linux/nvme-fc-driver.h index abcefb708008..7df9faef5af0 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; }; @@ -244,6 +247,9 @@ struct nvme_fc_local_port { * The length of the buffer corresponds to the remote_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 or login * state. LLDD may reference fields directly to change them. Initialized by @@ -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; -- 2.11.0