Message ID | 20220414055431.19712-1-njavali@marvell.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | qla2xxx: Add an additional flag to fc_host_fpin_rcv() | expand |
Martin, Please ignore this patch. I will re-send patch as RFC. Thanks, Nilesh > -----Original Message----- > From: Nilesh Javali <njavali@marvell.com> > Sent: Thursday, April 14, 2022 11:25 AM > To: martin.petersen@oracle.com > Cc: linux-scsi@vger.kernel.org; GR-QLogic-Storage-Upstream <GR-QLogic- > Storage-Upstream@marvell.com> > Subject: [PATCH] qla2xxx: Add an additional flag to fc_host_fpin_rcv() > > From: Anil Gurumurthy <agurumurthy@marvell.com> > > The LLDD and the stack currently process FPINs received from the fabric, > but the stack is not aware of any action taken by the driver to alleviate > congestion. The current interface between the driver and the SCSI stack is > limited to passing the notification mainly for statistics and heuristics. > > The reaction to an FPIN could be handled either by the driver or by the > stack (marginal path and failover). This patch enhances the interface to > indicate if action on an FPIN has already been taken by the LLDDs or not. > Add an additional flag to fc_host_fpin_rcv() to indicate if the FPIN has > been processed by the driver. > > Signed-off-by: Anil Gurumurthy <agurumurthy@marvell.com> > Signed-off-by: Nilesh Javali <njavali@marvell.com> > --- > drivers/scsi/lpfc/lpfc_els.c | 2 +- > drivers/scsi/qla2xxx/qla_isr.c | 2 +- > drivers/scsi/scsi_transport_fc.c | 6 +++++- > include/scsi/scsi_transport_fc.h | 2 +- > 4 files changed, 8 insertions(+), 4 deletions(-) > > diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c > index 3a445a0fea86..e221c25b848d 100644 > --- a/drivers/scsi/lpfc/lpfc_els.c > +++ b/drivers/scsi/lpfc/lpfc_els.c > @@ -10084,7 +10084,7 @@ lpfc_els_rcv_fpin(struct lpfc_vport *vport, void > *p, u32 fpin_length) > /* Send every descriptor individually to the upper layer */ > if (deliver) > fc_host_fpin_rcv(lpfc_shost_from_vport(vport), > - fpin_length, (char *)fpin); > + fpin_length, (char *)fpin, false); > desc_cnt++; > } > } > diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c > index 21b31d6359c8..e01d9a671749 100644 > --- a/drivers/scsi/qla2xxx/qla_isr.c > +++ b/drivers/scsi/qla2xxx/qla_isr.c > @@ -45,7 +45,7 @@ qla27xx_process_purex_fpin(struct scsi_qla_host *vha, > struct purex_item *item) > ql_dump_buffer(ql_dbg_init + ql_dbg_verbose, vha, 0x508f, > pkt, pkt_size); > > - fc_host_fpin_rcv(vha->host, pkt_size, (char *)pkt); > + fc_host_fpin_rcv(vha->host, pkt_size, (char *)pkt, false); > } > > const char *const port_state_str[] = { > diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c > index a2524106206d..6de476f13512 100644 > --- a/drivers/scsi/scsi_transport_fc.c > +++ b/drivers/scsi/scsi_transport_fc.c > @@ -892,12 +892,13 @@ fc_fpin_congn_stats_update(struct Scsi_Host > *shost, > * @shost: host the FPIN was received on > * @fpin_len: length of FPIN payload, in bytes > * @fpin_buf: pointer to FPIN payload > + * @hba_process: true if LLDD has acted on the FPIN > * > * Notes: > * This routine assumes no locks are held on entry. > */ > void > -fc_host_fpin_rcv(struct Scsi_Host *shost, u32 fpin_len, char *fpin_buf) > +fc_host_fpin_rcv(struct Scsi_Host *shost, u32 fpin_len, char *fpin_buf, bool > hba_process) > { > struct fc_els_fpin *fpin = (struct fc_els_fpin *)fpin_buf; > struct fc_tlv_desc *tlv; > @@ -925,6 +926,9 @@ fc_host_fpin_rcv(struct Scsi_Host *shost, u32 > fpin_len, char *fpin_buf) > case ELS_DTAG_CONGESTION: > fc_fpin_congn_stats_update(shost, tlv); > } > + /* If the event has not been processed, mark path as > marginal */ > + if (!hba_process) > + fc_host_port_state(shost) = > FC_PORTSTATE_MARGINAL; > > desc_cnt++; > bytes_remain -= FC_TLV_DESC_SZ_FROM_LENGTH(tlv); > diff --git a/include/scsi/scsi_transport_fc.h b/include/scsi/scsi_transport_fc.h > index e80a7c542c88..a987db5c7d63 100644 > --- a/include/scsi/scsi_transport_fc.h > +++ b/include/scsi/scsi_transport_fc.h > @@ -856,7 +856,7 @@ void fc_host_post_fc_event(struct Scsi_Host *shost, > u32 event_number, > * Note: when calling fc_host_post_fc_event(), vendor_id may be > * specified as 0. > */ > -void fc_host_fpin_rcv(struct Scsi_Host *shost, u32 fpin_len, char *fpin_buf); > +void fc_host_fpin_rcv(struct Scsi_Host *shost, u32 fpin_len, char *fpin_buf, > bool hba_process); > struct fc_vport *fc_vport_create(struct Scsi_Host *shost, int channel, > struct fc_vport_identifiers *); > int fc_vport_terminate(struct fc_vport *vport); > -- > 2.23.1
diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c index 3a445a0fea86..e221c25b848d 100644 --- a/drivers/scsi/lpfc/lpfc_els.c +++ b/drivers/scsi/lpfc/lpfc_els.c @@ -10084,7 +10084,7 @@ lpfc_els_rcv_fpin(struct lpfc_vport *vport, void *p, u32 fpin_length) /* Send every descriptor individually to the upper layer */ if (deliver) fc_host_fpin_rcv(lpfc_shost_from_vport(vport), - fpin_length, (char *)fpin); + fpin_length, (char *)fpin, false); desc_cnt++; } } diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 21b31d6359c8..e01d9a671749 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c @@ -45,7 +45,7 @@ qla27xx_process_purex_fpin(struct scsi_qla_host *vha, struct purex_item *item) ql_dump_buffer(ql_dbg_init + ql_dbg_verbose, vha, 0x508f, pkt, pkt_size); - fc_host_fpin_rcv(vha->host, pkt_size, (char *)pkt); + fc_host_fpin_rcv(vha->host, pkt_size, (char *)pkt, false); } const char *const port_state_str[] = { diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c index a2524106206d..6de476f13512 100644 --- a/drivers/scsi/scsi_transport_fc.c +++ b/drivers/scsi/scsi_transport_fc.c @@ -892,12 +892,13 @@ fc_fpin_congn_stats_update(struct Scsi_Host *shost, * @shost: host the FPIN was received on * @fpin_len: length of FPIN payload, in bytes * @fpin_buf: pointer to FPIN payload + * @hba_process: true if LLDD has acted on the FPIN * * Notes: * This routine assumes no locks are held on entry. */ void -fc_host_fpin_rcv(struct Scsi_Host *shost, u32 fpin_len, char *fpin_buf) +fc_host_fpin_rcv(struct Scsi_Host *shost, u32 fpin_len, char *fpin_buf, bool hba_process) { struct fc_els_fpin *fpin = (struct fc_els_fpin *)fpin_buf; struct fc_tlv_desc *tlv; @@ -925,6 +926,9 @@ fc_host_fpin_rcv(struct Scsi_Host *shost, u32 fpin_len, char *fpin_buf) case ELS_DTAG_CONGESTION: fc_fpin_congn_stats_update(shost, tlv); } + /* If the event has not been processed, mark path as marginal */ + if (!hba_process) + fc_host_port_state(shost) = FC_PORTSTATE_MARGINAL; desc_cnt++; bytes_remain -= FC_TLV_DESC_SZ_FROM_LENGTH(tlv); diff --git a/include/scsi/scsi_transport_fc.h b/include/scsi/scsi_transport_fc.h index e80a7c542c88..a987db5c7d63 100644 --- a/include/scsi/scsi_transport_fc.h +++ b/include/scsi/scsi_transport_fc.h @@ -856,7 +856,7 @@ void fc_host_post_fc_event(struct Scsi_Host *shost, u32 event_number, * Note: when calling fc_host_post_fc_event(), vendor_id may be * specified as 0. */ -void fc_host_fpin_rcv(struct Scsi_Host *shost, u32 fpin_len, char *fpin_buf); +void fc_host_fpin_rcv(struct Scsi_Host *shost, u32 fpin_len, char *fpin_buf, bool hba_process); struct fc_vport *fc_vport_create(struct Scsi_Host *shost, int channel, struct fc_vport_identifiers *); int fc_vport_terminate(struct fc_vport *vport);