Message ID | 1596445485-19834-10-git-send-email-cang@codeaurora.org (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Fix up and simplify error recovery mechanism | expand |
On Mon, 2020-08-03 at 02:04 -0700, Can Guo wrote: > In current UFS task abort hook, namely ufshcd_abort(), if a task is > aborted successfully, clock scaling busy time statistics is not updated > and, most important, clk_gating.active_reqs is not decreased, which makes > clk_gating.active_reqs stay above zero forever, thus clock gating would > never happen. To fix it, instead of releasing resources "mannually", use > the existing func __ufshcd_transfer_req_compl(). This can also eliminate > racing of scsi_dma_unmap() from the real completion in IRQ handler path. > > Signed-off-by: Can Guo <cang@codeaurora.org> > CC: Stanley Chu <stanley.chu@mediatek.com> > --- > drivers/scsi/ufs/ufshcd.c | 5 +---- > 1 file changed, 1 insertion(+), 4 deletions(-) > > diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c > index d7d2758..9a48389 100644 > --- a/drivers/scsi/ufs/ufshcd.c > +++ b/drivers/scsi/ufs/ufshcd.c > @@ -6635,11 +6635,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: Reviewed-by: Stanley Chu <stanley.chu@mediatek.com>
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index d7d2758..9a48389 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -6635,11 +6635,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:
In current UFS task abort hook, namely ufshcd_abort(), if a task is aborted successfully, clock scaling busy time statistics is not updated and, most important, clk_gating.active_reqs is not decreased, which makes clk_gating.active_reqs stay above zero forever, thus clock gating would never happen. To fix it, instead of releasing resources "mannually", use the existing func __ufshcd_transfer_req_compl(). This can also eliminate racing of scsi_dma_unmap() from the real completion in IRQ handler path. Signed-off-by: Can Guo <cang@codeaurora.org> CC: Stanley Chu <stanley.chu@mediatek.com> --- drivers/scsi/ufs/ufshcd.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)