Skip to content

Commit a5181c8

Browse files
Alice Chaomartinkpetersen
authored andcommitted
scsi: ufs: core: Fix race between force complete and ISR
While error handler force complete command (Thread A) and completion IRQ raising (Thread B) of the same command, it may cause race condition. Below is racing step (from 1 to 6): ufshcd_mcq_compl_pending_transfer (Thread A) 1 if (cmd && !test_bit(SCMD_STATE_COMPLETE, &cmd->state)) { 5 spin_lock_irqsave(&hwq->cq_lock, flags); // wait lock release set_host_byte(cmd, DID_REQUEUE); 6 ufshcd_release_scsi_cmd(hba, lrbp); // access null pointer scsi_done(cmd); spin_unlock_irqrestore(&hwq->cq_lock, flags); } ufshcd_mcq_poll_cqe_lock (Thread B) 2 spin_lock_irqsave(&hwq->cq_lock, flags); ufshcd_mcq_poll_cqe_nolock() ufshcd_compl_one_cqe() 3 ufshcd_release_scsi_cmd() // lrbp->cmd = NULL; 4 spin_unlock_irqrestore(&hwq->cq_lock, flags); Signed-off-by: Alice Chao <alice.chao@mediatek.com> Link: https://lore.kernel.org/r/20231024084324.12197-1-alice.chao@mediatek.com Reviewed-by: Bart Van Assche <bvanassche@acm.org> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1 parent f2d79aa commit a5181c8

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

drivers/ufs/core/ufshcd.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5615,13 +5615,13 @@ static void ufshcd_mcq_compl_pending_transfer(struct ufs_hba *hba,
56155615
* For those cmds of which the cqes are not present
56165616
* in the cq, complete them explicitly.
56175617
*/
5618+
spin_lock_irqsave(&hwq->cq_lock, flags);
56185619
if (cmd && !test_bit(SCMD_STATE_COMPLETE, &cmd->state)) {
5619-
spin_lock_irqsave(&hwq->cq_lock, flags);
56205620
set_host_byte(cmd, DID_REQUEUE);
56215621
ufshcd_release_scsi_cmd(hba, lrbp);
56225622
scsi_done(cmd);
5623-
spin_unlock_irqrestore(&hwq->cq_lock, flags);
56245623
}
5624+
spin_unlock_irqrestore(&hwq->cq_lock, flags);
56255625
} else {
56265626
ufshcd_mcq_poll_cqe_lock(hba, hwq);
56275627
}

0 commit comments

Comments
 (0)