]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
scsi: lpfc: Fix Abort request WQ selection
authorJames Smart <jsmart2021@gmail.com>
Mon, 9 Apr 2018 21:24:25 +0000 (14:24 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 18 Apr 2018 23:34:02 +0000 (19:34 -0400)
When running loads that generated aborts, io errors where seen.  Turns
out the abort requests where not placed on the proper WQ resulting in
the errors. Closer inspection inspection of this error also showed
improper spinlock api use.

Correct the WQ selection policy for the abort requests.  Correct
spin_lock/spin_lock_irq/spin_lock_irqsave usage.

Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_scsi.c
drivers/scsi/lpfc/lpfc_sli.c

index 8570486013f32675b70cc5474b5c5deb0c85757b..7932bf30c8d73c1bd02efd4b8a1f1cdd52ee6e42 100644 (file)
@@ -1021,7 +1021,7 @@ lpfc_get_scsi_buf_s4(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp)
                if (lpfc_test_rrq_active(phba, ndlp,
                                         lpfc_cmd->cur_iocbq.sli4_lxritag))
                        continue;
-               list_del(&lpfc_cmd->list);
+               list_del_init(&lpfc_cmd->list);
                found = 1;
                break;
        }
@@ -1036,7 +1036,7 @@ lpfc_get_scsi_buf_s4(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp)
                        if (lpfc_test_rrq_active(
                                phba, ndlp, lpfc_cmd->cur_iocbq.sli4_lxritag))
                                continue;
-                       list_del(&lpfc_cmd->list);
+                       list_del_init(&lpfc_cmd->list);
                        found = 1;
                        break;
                }
@@ -4716,7 +4716,7 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd)
        int ret = SUCCESS, status = 0;
        struct lpfc_sli_ring *pring_s4;
        int ret_val;
-       unsigned long flags, iflags;
+       unsigned long flags;
        DECLARE_WAIT_QUEUE_HEAD_ONSTACK(waitq);
 
        status = fc_block_scsi_eh(cmnd);
@@ -4816,16 +4816,16 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd)
        abtsiocb->iocb_cmpl = lpfc_sli_abort_fcp_cmpl;
        abtsiocb->vport = vport;
        if (phba->sli_rev == LPFC_SLI_REV4) {
-               pring_s4 = lpfc_sli4_calc_ring(phba, iocb);
+               pring_s4 = lpfc_sli4_calc_ring(phba, abtsiocb);
                if (pring_s4 == NULL) {
                        ret = FAILED;
                        goto out_unlock;
                }
                /* Note: both hbalock and ring_lock must be set here */
-               spin_lock_irqsave(&pring_s4->ring_lock, iflags);
+               spin_lock(&pring_s4->ring_lock);
                ret_val = __lpfc_sli_issue_iocb(phba, pring_s4->ringno,
                                                abtsiocb, 0);
-               spin_unlock_irqrestore(&pring_s4->ring_lock, iflags);
+               spin_unlock(&pring_s4->ring_lock);
        } else {
                ret_val = __lpfc_sli_issue_iocb(phba, LPFC_FCP_RING,
                                                abtsiocb, 0);
index e0a8c800819582d5b128972a52ca8335d4a674e3..38993efbe37e7d9ac8da0545e253cf88a87bd5ed 100644 (file)
@@ -11300,11 +11300,11 @@ lpfc_sli_abort_taskmgmt(struct lpfc_vport *vport, struct lpfc_sli_ring *pring,
        unsigned long iflags;
        struct lpfc_sli_ring *pring_s4;
 
-       spin_lock_irq(&phba->hbalock);
+       spin_lock_irqsave(&phba->hbalock, iflags);
 
        /* all I/Os are in process of being flushed */
        if (phba->hba_flag & HBA_FCP_IOQ_FLUSH) {
-               spin_unlock_irq(&phba->hbalock);
+               spin_unlock_irqrestore(&phba->hbalock, iflags);
                return 0;
        }
        sum = 0;
@@ -11366,14 +11366,14 @@ lpfc_sli_abort_taskmgmt(struct lpfc_vport *vport, struct lpfc_sli_ring *pring,
                iocbq->iocb_flag |= LPFC_DRIVER_ABORTED;
 
                if (phba->sli_rev == LPFC_SLI_REV4) {
-                       pring_s4 = lpfc_sli4_calc_ring(phba, iocbq);
-                       if (pring_s4 == NULL)
+                       pring_s4 = lpfc_sli4_calc_ring(phba, abtsiocbq);
+                       if (!pring_s4)
                                continue;
                        /* Note: both hbalock and ring_lock must be set here */
-                       spin_lock_irqsave(&pring_s4->ring_lock, iflags);
+                       spin_lock(&pring_s4->ring_lock);
                        ret_val = __lpfc_sli_issue_iocb(phba, pring_s4->ringno,
                                                        abtsiocbq, 0);
-                       spin_unlock_irqrestore(&pring_s4->ring_lock, iflags);
+                       spin_unlock(&pring_s4->ring_lock);
                } else {
                        ret_val = __lpfc_sli_issue_iocb(phba, pring->ringno,
                                                        abtsiocbq, 0);
@@ -11385,7 +11385,7 @@ lpfc_sli_abort_taskmgmt(struct lpfc_vport *vport, struct lpfc_sli_ring *pring,
                else
                        sum++;
        }
-       spin_unlock_irq(&phba->hbalock);
+       spin_unlock_irqrestore(&phba->hbalock, iflags);
        return sum;
 }