On Sat, 2019-09-07 at 21:34 -0400, cdupu...@gmail.com wrote:
> On Fri, 2019-09-06 at 16:26 -0400, Laurence Oberman wrote:
> > The qla2xxx driver had this issue as well when the newer array
> > firmware returned the retry_delay_timer in the fcp_rsp.
> > The bnx2fc is not handling the masking of the scope bits either
> > so the retry_delay_timestamp value lands up being a large value
> > added to the timer timestamp delaying I/O for up to 27 Minutes.
> > This patch adds similar code to handle this to the
> > bnx2fc driver to avoid the huge delay.
> > 
> > Signed-off-by: Laurence Oberman <lober...@redhat.com>
> > ---
> >  drivers/scsi/bnx2fc/bnx2fc_io.c | 23 ++++++++++++++++++++---
> >  1 file changed, 20 insertions(+), 3 deletions(-)
> > 
> > diff --git a/drivers/scsi/bnx2fc/bnx2fc_io.c
> > b/drivers/scsi/bnx2fc/bnx2fc_io.c
> > index 9e50e5b..39f4aeb 100644
> > --- a/drivers/scsi/bnx2fc/bnx2fc_io.c
> > +++ b/drivers/scsi/bnx2fc/bnx2fc_io.c
> > @@ -1928,6 +1928,7 @@ void bnx2fc_process_scsi_cmd_compl(struct
> > bnx2fc_cmd *io_req,
> >     struct bnx2fc_rport *tgt = io_req->tgt;
> >     struct scsi_cmnd *sc_cmd;
> >     struct Scsi_Host *host;
> > +   u16 scope, qualifier = 0;
> >  
> >  
> >     /* scsi_cmd_cmpl is called with tgt lock held */
> > @@ -1997,12 +1998,28 @@ void bnx2fc_process_scsi_cmd_compl(struct
> > bnx2fc_cmd *io_req,
> >  
> >                     if (io_req->cdb_status ==
> > SAM_STAT_TASK_SET_FULL ||
> >                         io_req->cdb_status == SAM_STAT_BUSY) {
> > +                           /* Newer array firmware with BUSY or
> > +                            * TASK_SET_FULL may return a status
> > that needs
> > +                            * the scope bits masked.
> > +                            * Or a huge delay timestamp up to 27
> > minutes
> > +                            * can result.
> > +                           */
> > +                           if (fcp_rsp->retry_delay_timer) {
> > +                                   /* Upper 2 bits */
> > +                                   scope = fcp_rsp-
> > > retry_delay_timer
> > 
> > +                                           & 0xC000;
> > +                                   /* Lower 14 bits */
> > +                                   qualifier = fcp_rsp-
> > > retry_delay_timer
> > 
> > +                                           & 0x3FFF;
> > +                           }
> > +                           if (scope > 0 && qualifier > 0 &&
> > +                                   qualifier <= 0x3FEF) {
> >                             /* Set the jiffies + retry_delay_timer
> > * 100ms
> >                                for the rport/tgt */
> > -                           tgt->retry_delay_timestamp = jiffies +
> > -                                   fcp_rsp->retry_delay_timer * HZ
> > / 10;
> > +                                   tgt->retry_delay_timestamp =
> > jiffies +
> > +                                           (qualifier * HZ / 10);
> > +                           }
> >                     }
> > -
> >             }
> >             if (io_req->fcp_resid)
> >                     scsi_set_resid(sc_cmd, io_req->fcp_resid);
> 
> What better thing to be doing than reviewing patches on a Saturday
> evening.  Looks good though I might suggest moving the indent of the
> comment in the new if statement.
> 
> Reviewed-by: Chad Dupuis <cdupu...@gmail.com>
> 

The qla2xxx driver had this issue as well when the newer array
firmware returned the retry_delay_timer in the fcp_rsp.
The bnx2fc is not handling the masking of the scope bits either
so the retry_delay_timestamp value lands up being a large value
added to the timer timestamp delaying I/O for up to 27 Minutes.
This patch adds similar code to handle this to the
bnx2fc driver to avoid the huge delay.

V2. Indent comments as suggested

Signed-off-by: Laurence Oberman <lober...@redhat.com>
Reported-by: David Jeffery <djeff...@redhat.com>

---
 drivers/scsi/bnx2fc/bnx2fc_io.c | 23 ++++++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/bnx2fc/bnx2fc_io.c
b/drivers/scsi/bnx2fc/bnx2fc_io.c
index 9e50e5b..39f4aeb 100644
--- a/drivers/scsi/bnx2fc/bnx2fc_io.c
+++ b/drivers/scsi/bnx2fc/bnx2fc_io.c
@@ -1928,6 +1928,7 @@ void bnx2fc_process_scsi_cmd_compl(struct
bnx2fc_cmd *io_req,
        struct bnx2fc_rport *tgt = io_req->tgt;
        struct scsi_cmnd *sc_cmd;
        struct Scsi_Host *host;
+       u16 scope, qualifier = 0;
 
 
        /* scsi_cmd_cmpl is called with tgt lock held */
@@ -1997,12 +1998,28 @@ void bnx2fc_process_scsi_cmd_compl(struct
bnx2fc_cmd *io_req,
 
                        if (io_req->cdb_status ==
SAM_STAT_TASK_SET_FULL ||
                            io_req->cdb_status == SAM_STAT_BUSY) {
+                               /* Newer array firmware with BUSY or
+                                * TASK_SET_FULL may return a status
that needs
+                                * the scope bits masked.
+                                * Or a huge delay timestamp up to 27
minutes
+                                * can result.
+                               */
+                               if (fcp_rsp->retry_delay_timer) {
+                                       /* Upper 2 bits */
+                                       scope = fcp_rsp-
>retry_delay_timer
+                                               & 0xC000;
+                                       /* Lower 14 bits */
+                                       qualifier = fcp_rsp-
>retry_delay_timer
+                                               & 0x3FFF;
+                               }
+                               if (scope > 0 && qualifier > 0 &&
+                                       qualifier <= 0x3FEF) {
                                        /* Set the jiffies +
retry_delay_timer * 100ms
                                        for the rport/tgt */
-                               tgt->retry_delay_timestamp = jiffies +
-                                       fcp_rsp->retry_delay_timer * HZ
/ 10;
+                                       tgt->retry_delay_timestamp =
jiffies +
+                                               (qualifier * HZ / 10);
+                               }
                        }
-
                }
                if (io_req->fcp_resid)
                        scsi_set_resid(sc_cmd, io_req->fcp_resid);
-- 
1.8.3.1


Reply via email to