[PATCH 5/5] lpfc: Add sysfs interface to post NVME RSCN
Ewan D. Milne
emilne at redhat.com
Thu Nov 2 13:09:43 PDT 2017
On Sat, 2017-10-28 at 10:21 -0700, James Smart wrote:
> From: Dick Kennedy <dick.kennedy at broadcom.com>
>
> To support scenarios which aren't bound to nvmetcli add port scenarios,
> which is currently where the transport invokes the nvme_subsystem_changed
> callback, add a syfs attribute to lpfc which can be written to cause
> an RSCN to be generated for the nport.
>
> Signed-off-by: Dick Kennedy <dick.kennedy at broadcom.com>
> Signed-off-by: James Smart <james.smart at broadcom.com>
> ---
> drivers/scsi/lpfc/lpfc.h | 1 +
> drivers/scsi/lpfc/lpfc_attr.c | 62 +++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 63 insertions(+)
>
> diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h
> index 157788f0bc10..52d403548a3a 100644
> --- a/drivers/scsi/lpfc/lpfc.h
> +++ b/drivers/scsi/lpfc/lpfc.h
> @@ -781,6 +781,7 @@ struct lpfc_hba {
> uint32_t cfg_use_msi;
> uint32_t cfg_auto_imax;
> uint32_t cfg_fcp_imax;
> + uint32_t cfg_force_rscn;
> uint32_t cfg_fcp_cpu_map;
> uint32_t cfg_fcp_io_channel;
> uint32_t cfg_suppress_rsp;
> diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c
> index c17677f494af..6e8e54e65e25 100644
> --- a/drivers/scsi/lpfc/lpfc_attr.c
> +++ b/drivers/scsi/lpfc/lpfc_attr.c
> @@ -4469,6 +4469,66 @@ static DEVICE_ATTR(lpfc_req_fw_upgrade, S_IRUGO | S_IWUSR,
> lpfc_request_firmware_upgrade_store);
>
> /**
> + * lpfc_force_rscn_store
> + *
> + * @dev: class device that is converted into a Scsi_host.
> + * @attr: device attribute, not used.
> + * @buf: unused string
> + * @count: unused variable.
> + *
> + * Description:
> + * Force the switch to send a RSCN to all other NPorts in our zone
> + * If we are direct connect pt2pt, build the RSCN command ourself
> + * and send to the other NPort. Not supported for private loop.
> + *
> + * Returns:
> + * 0 - on success
> + * -EIO - if command is not sent
> + **/
> +static ssize_t
> +lpfc_force_rscn_store(struct device *dev, struct device_attribute *attr,
> + const char *buf, size_t count)
> +{
> + struct Scsi_Host *shost = class_to_shost(dev);
> + struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
> + int i;
> +
> + i = lpfc_issue_els_rscn(vport, 0);
> + if (i)
> + return -EIO;
> + return strlen(buf);
> +}
> +
> +/*
> + * lpfc_force_rscn: Force an RSCN to be sent to all remote NPorts
> + * connected to the HBA.
> + *
> + * Value range is any ascii value
> + */
> +static int lpfc_force_rscn;
> +module_param(lpfc_force_rscn, int, 0644);
> +MODULE_PARM_DESC(lpfc_force_rscn,
> + "Force an RSCN to be sent to all remote NPorts");
> +lpfc_param_show(force_rscn)
> +
> +/**
> + * lpfc_force_rscn_init - Force an RSCN to be sent to all remote NPorts
> + * @phba: lpfc_hba pointer.
> + * @val: unused value.
> + *
> + * Returns:
> + * zero if val saved.
> + **/
> +static int
> +lpfc_force_rscn_init(struct lpfc_hba *phba, int val)
> +{
> + return 0;
> +}
> +
> +static DEVICE_ATTR(lpfc_force_rscn, 0644,
> + lpfc_force_rscn_show, lpfc_force_rscn_store);
> +
> +/**
> * lpfc_fcp_imax_store
> *
> * @dev: class device that is converted into a Scsi_host.
> @@ -5218,6 +5278,7 @@ struct device_attribute *lpfc_hba_attrs[] = {
> &dev_attr_lpfc_nvme_oas,
> &dev_attr_lpfc_auto_imax,
> &dev_attr_lpfc_fcp_imax,
> + &dev_attr_lpfc_force_rscn,
> &dev_attr_lpfc_fcp_cpu_map,
> &dev_attr_lpfc_fcp_io_channel,
> &dev_attr_lpfc_suppress_rsp,
> @@ -6238,6 +6299,7 @@ lpfc_get_cfgparam(struct lpfc_hba *phba)
> lpfc_nvme_oas_init(phba, lpfc_nvme_oas);
> lpfc_auto_imax_init(phba, lpfc_auto_imax);
> lpfc_fcp_imax_init(phba, lpfc_fcp_imax);
> + lpfc_force_rscn_init(phba, lpfc_force_rscn);
> lpfc_fcp_cpu_map_init(phba, lpfc_fcp_cpu_map);
> lpfc_enable_hba_reset_init(phba, lpfc_enable_hba_reset);
> lpfc_enable_hba_heartbeat_init(phba, lpfc_enable_hba_heartbeat);
So, with this sysfs interface, if someone accidentally or intentionally
issues RSCNs in a loop at high frequency, what is this going to do to
the FC fabric?
Most people know to use single-initiator zoning, but the affected target
ports would still get the RSCN, correct?
-Ewan
More information about the Linux-nvme
mailing list