scsi: ufs: Properly release resources if a task is aborted successfully
authorCan Guo <cang@codeaurora.org>
Sun, 9 Aug 2020 12:15:55 +0000 (05:15 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 21 Aug 2020 01:41:25 +0000 (21:41 -0400)
In current UFS task abort hook, namely ufshcd_abort(), if one task is
aborted successfully, clk_gating.active_reqs held by this task is not
decreased, which makes clk_gating.active_reqs stay above zero forever, thus
clock gating would never happen. Instead of releasing resources of one task
"manually", use the existing func __ufshcd_transfer_req_compl().  This
change also eliminates a possible race of scsi_dma_unmap() from the real
completion in IRQ handler path.

Link: https://lore.kernel.org/r/1596975355-39813-10-git-send-email-cang@codeaurora.org
Fixes: 1ab27c9cf8b6 ("ufs: Add support for clock gating")
CC: Stanley Chu <stanley.chu@mediatek.com>
Reviewed-by: Stanley Chu <stanley.chu@mediatek.com>
Reviewed-by: Asutosh Das <asutoshd@codeaurora.org>
Signed-off-by: Can Guo <cang@codeaurora.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/ufs/ufshcd.c

index 9ebb5cd..efb40b1 100644 (file)
@@ -6636,11 +6636,8 @@ static int ufshcd_abort(struct scsi_cmnd *cmd)
                goto out;
        }
 
-       scsi_dma_unmap(cmd);
-
        spin_lock_irqsave(host->host_lock, flags);
-       ufshcd_outstanding_req_clear(hba, tag);
-       hba->lrb[tag].cmd = NULL;
+       __ufshcd_transfer_req_compl(hba, (1UL << tag));
        spin_unlock_irqrestore(host->host_lock, flags);
 
 out: