Re: [PATCH 10/12] lpfc: Implement GID_PT on Nameserver query to support faster failover

2018-10-29 Thread Hannes Reinecke

On 10/23/18 10:41 PM, James Smart wrote:

The switches seem to respond faster to GID_PT vs GID_FT NameServer
queries.  Add support for GID_PT to be used over GID_FT to enable
faster storage failover detection. Includes addition of new module
parameter to select between GID_PT and GID_FT (GID_FT is default).

Signed-off-by: Dick Kennedy 
Signed-off-by: James Smart 
---
  drivers/scsi/lpfc/lpfc.h   |   1 +
  drivers/scsi/lpfc/lpfc_attr.c  |  14 +++
  drivers/scsi/lpfc/lpfc_crtn.h  |   1 +
  drivers/scsi/lpfc/lpfc_ct.c| 206 +
  drivers/scsi/lpfc/lpfc_els.c   |  10 +-
  drivers/scsi/lpfc/lpfc_hbadisc.c   |  29 ++
  drivers/scsi/lpfc/lpfc_hw.h|   1 +
  drivers/scsi/lpfc/lpfc_hw4.h   |   4 +
  drivers/scsi/lpfc/lpfc_nportdisc.c |  13 ++-
  9 files changed, 275 insertions(+), 4 deletions(-)


Reviewed-by: Hannes Reinecke 

Cheers,

Hannes


[PATCH 10/12] lpfc: Implement GID_PT on Nameserver query to support faster failover

2018-10-23 Thread James Smart
The switches seem to respond faster to GID_PT vs GID_FT NameServer
queries.  Add support for GID_PT to be used over GID_FT to enable
faster storage failover detection. Includes addition of new module
parameter to select between GID_PT and GID_FT (GID_FT is default).

Signed-off-by: Dick Kennedy 
Signed-off-by: James Smart 
---
 drivers/scsi/lpfc/lpfc.h   |   1 +
 drivers/scsi/lpfc/lpfc_attr.c  |  14 +++
 drivers/scsi/lpfc/lpfc_crtn.h  |   1 +
 drivers/scsi/lpfc/lpfc_ct.c| 206 +
 drivers/scsi/lpfc/lpfc_els.c   |  10 +-
 drivers/scsi/lpfc/lpfc_hbadisc.c   |  29 ++
 drivers/scsi/lpfc/lpfc_hw.h|   1 +
 drivers/scsi/lpfc/lpfc_hw4.h   |   4 +
 drivers/scsi/lpfc/lpfc_nportdisc.c |  13 ++-
 9 files changed, 275 insertions(+), 4 deletions(-)

diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h
index 1dfe71f0fcfd..979366fc34d4 100644
--- a/drivers/scsi/lpfc/lpfc.h
+++ b/drivers/scsi/lpfc/lpfc.h
@@ -784,6 +784,7 @@ struct lpfc_hba {
 #define LPFC_FCF_PRIORITY 2/* Priority fcf failover */
uint32_t cfg_fcf_failover_policy;
uint32_t cfg_fcp_io_sched;
+   uint32_t cfg_ns_query;
uint32_t cfg_fcp2_no_tgt_reset;
uint32_t cfg_cr_delay;
uint32_t cfg_cr_count;
diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c
index 73e2296796e6..159ede7032dc 100644
--- a/drivers/scsi/lpfc/lpfc_attr.c
+++ b/drivers/scsi/lpfc/lpfc_attr.c
@@ -5065,6 +5065,18 @@ LPFC_ATTR_RW(fcp_io_sched, LPFC_FCP_SCHED_ROUND_ROBIN,
 "issuing commands [0] - Round Robin, [1] - Current CPU");
 
 /*
+ * lpfc_ns_query: Determine algrithmn for NameServer queries after RSCN
+ * range is [0,1]. Default value is 0.
+ * For [0], GID_FT is used for NameServer queries after RSCN (default)
+ * For [1], GID_PT is used for NameServer queries after RSCN
+ *
+ */
+LPFC_ATTR_RW(ns_query, LPFC_NS_QUERY_GID_FT,
+LPFC_NS_QUERY_GID_FT, LPFC_NS_QUERY_GID_PT,
+"Determine algorithm NameServer queries after RSCN "
+"[0] - GID_FT, [1] - GID_PT");
+
+/*
 # lpfc_fcp2_no_tgt_reset: Determine bus reset behavior
 # range is [0,1]. Default value is 0.
 # For [0], bus reset issues target reset to ALL devices
@@ -5509,6 +5521,7 @@ struct device_attribute *lpfc_hba_attrs[] = {
&dev_attr_lpfc_scan_down,
&dev_attr_lpfc_link_speed,
&dev_attr_lpfc_fcp_io_sched,
+   &dev_attr_lpfc_ns_query,
&dev_attr_lpfc_fcp2_no_tgt_reset,
&dev_attr_lpfc_cr_delay,
&dev_attr_lpfc_cr_count,
@@ -6559,6 +6572,7 @@ void
 lpfc_get_cfgparam(struct lpfc_hba *phba)
 {
lpfc_fcp_io_sched_init(phba, lpfc_fcp_io_sched);
+   lpfc_ns_query_init(phba, lpfc_ns_query);
lpfc_fcp2_no_tgt_reset_init(phba, lpfc_fcp2_no_tgt_reset);
lpfc_cr_delay_init(phba, lpfc_cr_delay);
lpfc_cr_count_init(phba, lpfc_cr_count);
diff --git a/drivers/scsi/lpfc/lpfc_crtn.h b/drivers/scsi/lpfc/lpfc_crtn.h
index e9b297a39e54..a4b1bc2782eb 100644
--- a/drivers/scsi/lpfc/lpfc_crtn.h
+++ b/drivers/scsi/lpfc/lpfc_crtn.h
@@ -175,6 +175,7 @@ void lpfc_hb_timeout_handler(struct lpfc_hba *);
 void lpfc_ct_unsol_event(struct lpfc_hba *, struct lpfc_sli_ring *,
 struct lpfc_iocbq *);
 int lpfc_ct_handle_unsol_abort(struct lpfc_hba *, struct hbq_dmabuf *);
+int lpfc_issue_gidpt(struct lpfc_vport *vport);
 int lpfc_issue_gidft(struct lpfc_vport *vport);
 int lpfc_get_gidft_type(struct lpfc_vport *vport, struct lpfc_iocbq *iocbq);
 int lpfc_ns_cmd(struct lpfc_vport *, int, uint8_t, uint32_t);
diff --git a/drivers/scsi/lpfc/lpfc_ct.c b/drivers/scsi/lpfc/lpfc_ct.c
index 789ad1502534..62e8ae3b4685 100644
--- a/drivers/scsi/lpfc/lpfc_ct.c
+++ b/drivers/scsi/lpfc/lpfc_ct.c
@@ -832,6 +832,198 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba *phba, struct 
lpfc_iocbq *cmdiocb,
 }
 
 static void
+lpfc_cmpl_ct_cmd_gid_pt(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
+   struct lpfc_iocbq *rspiocb)
+{
+   struct lpfc_vport *vport = cmdiocb->vport;
+   struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
+   IOCB_t *irsp;
+   struct lpfc_dmabuf *outp;
+   struct lpfc_dmabuf *inp;
+   struct lpfc_sli_ct_request *CTrsp;
+   struct lpfc_sli_ct_request *CTreq;
+   struct lpfc_nodelist *ndlp;
+   int rc;
+
+   /* First save ndlp, before we overwrite it */
+   ndlp = cmdiocb->context_un.ndlp;
+
+   /* we pass cmdiocb to state machine which needs rspiocb as well */
+   cmdiocb->context_un.rsp_iocb = rspiocb;
+   inp = (struct lpfc_dmabuf *)cmdiocb->context1;
+   outp = (struct lpfc_dmabuf *)cmdiocb->context2;
+   irsp = &rspiocb->iocb;
+
+   lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
+ "GID_PT cmpl: status:x%x/x%x rtry:%d",
+ irsp->ulpStatus, irsp->un.ulpWord[4],
+ vport->fc_ns_retry);
+
+