scsi: lpfc: Fix bad sgl reposting after 2nd adapter reset
authorDick Kennedy <dick.kennedy@broadcom.com>
Wed, 23 Aug 2017 23:55:45 +0000 (16:55 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 25 Aug 2017 02:29:42 +0000 (22:29 -0400)
Port issue was fixed, the hbacmd reset would take more than 8 minutes to
complete.

There were conflicting NVME SGL posting/reposting responsibilities
between lpfc_online()/lpfc_sli4_hba_setup() and
lpfc_nvme_create_localport().  The lpfc_online() causes a REPOST on
existing NVME SGLs which is not released during the fc port reset.
However, lpfc_nvme_create_localport() wants to allocate new NVME buffers
and post them. Both cancelled out each other which had a side effect of
hosing the mailbox handling that was used to remove the sgl lists -
causing multiple 60s mbx timeouts.

Fix by preserving all SGL lists over the fc port reset.

Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_nvme.c

index 24dc69de6023434d6830aa732e4bc27217a9f4c6..bb9ede2521b961ebc477808c09fe7b15c56bf6d3 100644 (file)
@@ -2181,8 +2181,15 @@ lpfc_nvme_create_localport(struct lpfc_vport *vport)
                vport->localport = localport;
                lport->vport = vport;
                vport->nvmei_support = 1;
-               len  = lpfc_new_nvme_buf(vport, phba->sli4_hba.nvme_xri_max);
-               vport->phba->total_nvme_bufs += len;
+
+               /* Don't post more new bufs if repost already recovered
+                * the nvme sgls.
+                */
+               if (phba->sli4_hba.nvme_xri_cnt == 0) {
+                       len  = lpfc_new_nvme_buf(vport,
+                                                phba->sli4_hba.nvme_xri_max);
+                       vport->phba->total_nvme_bufs += len;
+               }
        }
 
        return ret;