RE: [PATCH] qla2xxx: Add an additional flag to fc_host_fpin_rcv()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Martin,

Please ignore this patch. I will re-send patch as RFC.

Thanks,
Nilesh 

> -----Original Message-----
> From: Nilesh Javali <njavali@xxxxxxxxxxx>
> Sent: Thursday, April 14, 2022 11:25 AM
> To: martin.petersen@xxxxxxxxxx
> Cc: linux-scsi@xxxxxxxxxxxxxxx; GR-QLogic-Storage-Upstream <GR-QLogic-
> Storage-Upstream@xxxxxxxxxxx>
> Subject: [PATCH] qla2xxx: Add an additional flag to fc_host_fpin_rcv()
> 
> From: Anil Gurumurthy <agurumurthy@xxxxxxxxxxx>
> 
> 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@xxxxxxxxxxx>
> Signed-off-by: Nilesh Javali <njavali@xxxxxxxxxxx>
> ---
>  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





[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux