lkml.org 
[lkml]   [2019]   [Dec]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.4 001/134] scsi: lpfc: Fix spinlock_irq issues in lpfc_els_flush_cmd()
    Date
    From: James Smart <jsmart2021@gmail.com>

    [ Upstream commit d38b4a527fe898f859f74a3a43d4308f48ac7855 ]

    While reviewing the CT behavior, issues with spinlock_irq were seen. The
    driver should be using spinlock_irqsave/irqrestore in the els flush
    routine.

    Changed to spinlock_irqsave/irqrestore.

    Link: https://lore.kernel.org/r/20190922035906.10977-15-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: Sasha Levin <sashal@kernel.org>
    ---
    drivers/scsi/lpfc/lpfc_els.c | 16 +++++++++-------
    1 file changed, 9 insertions(+), 7 deletions(-)

    diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
    index d5303994bfd62..0052b341587d9 100644
    --- a/drivers/scsi/lpfc/lpfc_els.c
    +++ b/drivers/scsi/lpfc/lpfc_els.c
    @@ -7986,20 +7986,22 @@ lpfc_els_flush_cmd(struct lpfc_vport *vport)
    struct lpfc_sli_ring *pring;
    struct lpfc_iocbq *tmp_iocb, *piocb;
    IOCB_t *cmd = NULL;
    + unsigned long iflags = 0;

    lpfc_fabric_abort_vport(vport);
    +
    /*
    * For SLI3, only the hbalock is required. But SLI4 needs to coordinate
    * with the ring insert operation. Because lpfc_sli_issue_abort_iotag
    * ultimately grabs the ring_lock, the driver must splice the list into
    * a working list and release the locks before calling the abort.
    */
    - spin_lock_irq(&phba->hbalock);
    + spin_lock_irqsave(&phba->hbalock, iflags);
    pring = lpfc_phba_elsring(phba);

    /* Bail out if we've no ELS wq, like in PCI error recovery case. */
    if (unlikely(!pring)) {
    - spin_unlock_irq(&phba->hbalock);
    + spin_unlock_irqrestore(&phba->hbalock, iflags);
    return;
    }

    @@ -8037,21 +8039,21 @@ lpfc_els_flush_cmd(struct lpfc_vport *vport)

    if (phba->sli_rev == LPFC_SLI_REV4)
    spin_unlock(&pring->ring_lock);
    - spin_unlock_irq(&phba->hbalock);
    + spin_unlock_irqrestore(&phba->hbalock, iflags);

    /* Abort each txcmpl iocb on aborted list and remove the dlist links. */
    list_for_each_entry_safe(piocb, tmp_iocb, &abort_list, dlist) {
    - spin_lock_irq(&phba->hbalock);
    + spin_lock_irqsave(&phba->hbalock, iflags);
    list_del_init(&piocb->dlist);
    lpfc_sli_issue_abort_iotag(phba, pring, piocb);
    - spin_unlock_irq(&phba->hbalock);
    + spin_unlock_irqrestore(&phba->hbalock, iflags);
    }
    if (!list_empty(&abort_list))
    lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
    "3387 abort list for txq not empty\n");
    INIT_LIST_HEAD(&abort_list);

    - spin_lock_irq(&phba->hbalock);
    + spin_lock_irqsave(&phba->hbalock, iflags);
    if (phba->sli_rev == LPFC_SLI_REV4)
    spin_lock(&pring->ring_lock);

    @@ -8091,7 +8093,7 @@ lpfc_els_flush_cmd(struct lpfc_vport *vport)

    if (phba->sli_rev == LPFC_SLI_REV4)
    spin_unlock(&pring->ring_lock);
    - spin_unlock_irq(&phba->hbalock);
    + spin_unlock_irqrestore(&phba->hbalock, iflags);

    /* Cancel all the IOCBs from the completions list */
    lpfc_sli_cancel_iocbs(phba, &abort_list,
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-12-11 17:11    [W:4.033 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site