| From e639de2b39b09d3eaf29ed82cae4fc39332ba8e0 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 22 Mar 2020 11:12:57 -0700 |
| Subject: scsi: lpfc: Fix crash after handling a pci error |
| |
| From: James Smart <jsmart2021@gmail.com> |
| |
| [ Upstream commit 4cd70891308dfb875ef31060c4a4aa8872630a2e ] |
| |
| Injecting EEH on a 32GB card is causing kernel oops |
| |
| The pci error handler is doing an IO flush and the offline code is also |
| doing an IO flush. When the 1st flush is complete the hdwq is destroyed |
| (freed), yet the second flush accesses the hdwq and crashes. |
| |
| Added a check in lpfc_sli4_fush_io_rings to check both the HBA_IOQ_FLUSH |
| flag and the hdwq pointer to see if it is already set and not already |
| freed. |
| |
| Link: https://lore.kernel.org/r/20200322181304.37655-6-jsmart2021@gmail.com |
| Signed-off-by: James Smart <jsmart2021@gmail.com> |
| Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/scsi/lpfc/lpfc_sli.c | 5 +++++ |
| 1 file changed, 5 insertions(+) |
| |
| diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c |
| index 1692ce913b7f0..a951e1c8165ed 100644 |
| --- a/drivers/scsi/lpfc/lpfc_sli.c |
| +++ b/drivers/scsi/lpfc/lpfc_sli.c |
| @@ -4013,6 +4013,11 @@ lpfc_sli_flush_io_rings(struct lpfc_hba *phba) |
| struct lpfc_iocbq *piocb, *next_iocb; |
| |
| spin_lock_irq(&phba->hbalock); |
| + if (phba->hba_flag & HBA_IOQ_FLUSH || |
| + !phba->sli4_hba.hdwq) { |
| + spin_unlock_irq(&phba->hbalock); |
| + return; |
| + } |
| /* Indicate the I/O queues are flushed */ |
| phba->hba_flag |= HBA_IOQ_FLUSH; |
| spin_unlock_irq(&phba->hbalock); |
| -- |
| 2.20.1 |
| |