scsi: lpfc: Fix locking for lpfc_sli_iocbq_lookup()
The rules changed for lpfc_sli_iocbq_lookup() vs locking. Prior, the
routine properly took out the lock. In newly refactored code, the locks
must be held when calling the routine.
Fix lpfc_sli_process_sol_iocb() to take the locks before calling the
routine.
Fix lpfc_sli_handle_fast_ring_event() to not release the locks to call the
routine.
Link: https://lore.kernel.org/r/20220323205545.81814-3-jsmart2021@gmail.com
Fixes: 1b64aa9eae
("scsi: lpfc: SLI path split: Refactor fast and slow paths to native SLI4")
Co-developed-by: Dick Kennedy <dick.kennedy@broadcom.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>
This commit is contained in:
Родитель
7294a9bcaa
Коммит
c26bd6602e
|
@ -3721,7 +3721,15 @@ lpfc_sli_process_sol_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
|
|||
unsigned long iflag;
|
||||
u32 ulp_command, ulp_status, ulp_word4, ulp_context, iotag;
|
||||
|
||||
if (phba->sli_rev == LPFC_SLI_REV4)
|
||||
spin_lock_irqsave(&pring->ring_lock, iflag);
|
||||
else
|
||||
spin_lock_irqsave(&phba->hbalock, iflag);
|
||||
cmdiocbp = lpfc_sli_iocbq_lookup(phba, pring, saveq);
|
||||
if (phba->sli_rev == LPFC_SLI_REV4)
|
||||
spin_unlock_irqrestore(&pring->ring_lock, iflag);
|
||||
else
|
||||
spin_unlock_irqrestore(&phba->hbalock, iflag);
|
||||
|
||||
ulp_command = get_job_cmnd(phba, saveq);
|
||||
ulp_status = get_job_ulpstatus(phba, saveq);
|
||||
|
@ -4058,10 +4066,8 @@ lpfc_sli_handle_fast_ring_event(struct lpfc_hba *phba,
|
|||
break;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&phba->hbalock, iflag);
|
||||
cmdiocbq = lpfc_sli_iocbq_lookup(phba, pring,
|
||||
&rspiocbq);
|
||||
spin_lock_irqsave(&phba->hbalock, iflag);
|
||||
if (unlikely(!cmdiocbq))
|
||||
break;
|
||||
if (cmdiocbq->cmd_flag & LPFC_DRIVER_ABORTED)
|
||||
|
|
Загрузка…
Ссылка в новой задаче