| From a4c83c6c00752a123bbf074d2e99170b1d350b43 Mon Sep 17 00:00:00 2001 |
| From: James Smart <jsmart2021@gmail.com> |
| Date: Fri, 18 Oct 2019 14:18:22 -0700 |
| Subject: [PATCH] scsi: lpfc: Fix hardlockup in lpfc_abort_handler |
| |
| commit 91a52b617cdb8bf6d298892101c061d438b84a19 upstream. |
| |
| In lpfc_abort_handler, the lock acquire order is hbalock (irqsave), |
| buf_lock (irq) and ring_lock (irq). The issue is that in two places the |
| locks are released out of order - the buf_lock and the hbalock - resulting |
| in the cpu preemption/lock flags getting restored out of order and |
| deadlocking the cpu. |
| |
| Fix the unlock order by fully releasing the hbalocks as well. |
| |
| CC: Zhangguanghui <zhang.guanghui@h3c.com> |
| Link: https://lore.kernel.org/r/20191018211832.7917-7-jsmart2021@gmail.com |
| Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com> |
| Signed-off-by: James Smart <jsmart2021@gmail.com> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c |
| index 5b42a733a75f..31989b8863a1 100644 |
| --- a/drivers/scsi/lpfc/lpfc_scsi.c |
| +++ b/drivers/scsi/lpfc/lpfc_scsi.c |
| @@ -4685,20 +4685,21 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd) |
| ret_val = __lpfc_sli_issue_iocb(phba, LPFC_FCP_RING, |
| abtsiocb, 0); |
| } |
| - /* no longer need the lock after this point */ |
| - spin_unlock_irqrestore(&phba->hbalock, flags); |
| |
| if (ret_val == IOCB_ERROR) { |
| /* Indicate the IO is not being aborted by the driver. */ |
| iocb->iocb_flag &= ~LPFC_DRIVER_ABORTED; |
| lpfc_cmd->waitq = NULL; |
| spin_unlock(&lpfc_cmd->buf_lock); |
| + spin_unlock_irqrestore(&phba->hbalock, flags); |
| lpfc_sli_release_iocbq(phba, abtsiocb); |
| ret = FAILED; |
| goto out; |
| } |
| |
| + /* no longer need the lock after this point */ |
| spin_unlock(&lpfc_cmd->buf_lock); |
| + spin_unlock_irqrestore(&phba->hbalock, flags); |
| |
| if (phba->cfg_poll & DISABLE_FCP_RING_INT) |
| lpfc_sli_handle_fast_ring_event(phba, |
| -- |
| 2.7.4 |
| |