Patch "scsi: lpfc: Fix locking on mailbox command completion" has been added to the 4.14-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    scsi: lpfc: Fix locking on mailbox command completion

to the 4.14-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     scsi-lpfc-fix-locking-on-mailbox-command-completion.patch
and it can be found in the queue-4.14 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit e812e19711df294c627e6f445f7c852b1e0b33d9
Author: James Smart <jsmart2021@xxxxxxxxx>
Date:   Sat Sep 21 20:58:53 2019 -0700

    scsi: lpfc: Fix locking on mailbox command completion
    
    [ Upstream commit 07b8582430370097238b589f4e24da7613ca6dd3 ]
    
    Symptoms were seen of the driver not having valid data for mailbox
    commands. After debugging, the following sequence was found:
    
    The driver maintains a port-wide pointer of the mailbox command that is
    currently in execution. Once finished, the port-wide pointer is cleared
    (done in lpfc_sli4_mq_release()). The next mailbox command issued will set
    the next pointer and so on.
    
    The mailbox response data is only copied if there is a valid port-wide
    pointer.
    
    In the failing case, it was seen that a new mailbox command was being
    attempted in parallel with the completion.  The parallel path was seeing
    the mailbox no long in use (flag check under lock) and thus set the port
    pointer.  The completion path had cleared the active flag under lock, but
    had not touched the port pointer.  The port pointer is cleared after the
    lock is released. In this case, the completion path cleared the just-set
    value by the parallel path.
    
    Fix by making the calls that clear mbox state/port pointer while under
    lock.  Also slightly cleaned up the error path.
    
    Link: https://lore.kernel.org/r/20190922035906.10977-8-jsmart2021@xxxxxxxxx
    Signed-off-by: Dick Kennedy <dick.kennedy@xxxxxxxxxxxx>
    Signed-off-by: James Smart <jsmart2021@xxxxxxxxx>
    Signed-off-by: Martin K. Petersen <martin.petersen@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
index d3bad0dbfaf7..7920b8c72caf 100644
--- a/drivers/scsi/lpfc/lpfc_sli.c
+++ b/drivers/scsi/lpfc/lpfc_sli.c
@@ -12689,13 +12689,19 @@ send_current_mbox:
 	phba->sli.sli_flag &= ~LPFC_SLI_MBOX_ACTIVE;
 	/* Setting active mailbox pointer need to be in sync to flag clear */
 	phba->sli.mbox_active = NULL;
+	if (bf_get(lpfc_trailer_consumed, mcqe))
+		lpfc_sli4_mq_release(phba->sli4_hba.mbx_wq);
 	spin_unlock_irqrestore(&phba->hbalock, iflags);
 	/* Wake up worker thread to post the next pending mailbox command */
 	lpfc_worker_wake_up(phba);
+	return workposted;
+
 out_no_mqe_complete:
+	spin_lock_irqsave(&phba->hbalock, iflags);
 	if (bf_get(lpfc_trailer_consumed, mcqe))
 		lpfc_sli4_mq_release(phba->sli4_hba.mbx_wq);
-	return workposted;
+	spin_unlock_irqrestore(&phba->hbalock, iflags);
+	return false;
 }
 
 /**



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux