Message ID | 20200811141859.27399-2-huobean@gmail.com (mailing list archive) |
---|---|
State | Mainlined |
Commit | b10178ee7fa88b68a9e8adc06534d2605cb0ec23 |
Headers | show |
Series | scsi: ufs: two fixups of ufshcd_abort() | expand |
Hi Avri, Bean, On Tue, 2020-08-11 at 16:18 +0200, Bean Huo wrote: > From: Stanley Chu <stanley.chu@mediatek.com> > > If somehow no interrupt notification is raised for a completed request > and its doorbell bit is cleared by host, UFS driver needs to cleanup > its outstanding bit in ufshcd_abort(). Otherwise, system may behave > abnormally by below flow: > > After ufshcd_abort() returns, this request will be requeued by SCSI > layer with its outstanding bit set. Any future completed request > will trigger ufshcd_transfer_req_compl() to handle all "completed > outstanding bits". In this time, the "abnormal outstanding bit" > will be detected and the "requeued request" will be chosen to execute > request post-processing flow. This is wrong because this request is > still "alive". > > Signed-off-by: Stanley Chu <stanley.chu@mediatek.com> > Reviewed-by: Can Guo <cang@codeaurora.org> > Signed-off-by: Bean Huo <beanhuo@micron.com> Thanks Bean's patch integration. Like Avri's comment in https://patchwork.kernel.org/patch/11683381/ I think you could add Acked-by tag from Avri. Hi Avri, Please correct above description if required. Thanks for your review! : ) Thanks, Stanley Chu > --- > drivers/scsi/ufs/ufshcd.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c > index 307622284239..66fe814c8725 100644 > --- a/drivers/scsi/ufs/ufshcd.c > +++ b/drivers/scsi/ufs/ufshcd.c > @@ -6492,7 +6492,7 @@ static int ufshcd_abort(struct scsi_cmnd *cmd) > /* command completed already */ > dev_err(hba->dev, "%s: cmd at tag %d successfully cleared from DB.\n", > __func__, tag); > - goto out; > + goto cleanup; > } else { > dev_err(hba->dev, > "%s: no response from device. tag = %d, err %d\n", > @@ -6526,6 +6526,7 @@ static int ufshcd_abort(struct scsi_cmnd *cmd) > goto out; > } > > +cleanup: > scsi_dma_unmap(cmd); > > spin_lock_irqsave(host->host_lock, flags);
On Wed, 2020-08-12 at 20:47 +0800, Stanley Chu wrote: > Hi Avri, Bean, > > On Tue, 2020-08-11 at 16:18 +0200, Bean Huo wrote: > > From: Stanley Chu <stanley.chu@mediatek.com> > > > > If somehow no interrupt notification is raised for a completed > > request > > and its doorbell bit is cleared by host, UFS driver needs to > > cleanup > > its outstanding bit in ufshcd_abort(). Otherwise, system may behave > > abnormally by below flow: > > > > After ufshcd_abort() returns, this request will be requeued by SCSI > > layer with its outstanding bit set. Any future completed request > > will trigger ufshcd_transfer_req_compl() to handle all "completed > > outstanding bits". In this time, the "abnormal outstanding bit" > > will be detected and the "requeued request" will be chosen to > > execute > > request post-processing flow. This is wrong because this request is > > still "alive". > > > > Signed-off-by: Stanley Chu <stanley.chu@mediatek.com> > > Reviewed-by: Can Guo <cang@codeaurora.org> > > Signed-off-by: Bean Huo <beanhuo@micron.com> > > Thanks Bean's patch integration. > > Like Avri's comment in https://patchwork.kernel.org/patch/11683381/ > I think you could add Acked-by tag from Avri. > Hi Avri do I need to re-send the patchset to add your Acked-by tag? or you will sign your acked-by statement and append this patch? Thanks, Bean > > > Hi Avri, > > Please correct above description if required. > Thanks for your review! : ) > > > Thanks, > > Stanley Chu >
> > > > Signed-off-by: Stanley Chu <stanley.chu@mediatek.com> > > Reviewed-by: Can Guo <cang@codeaurora.org> > > Signed-off-by: Bean Huo <beanhuo@micron.com> Acked-by: Avri Altman <avri.altman@wdc.com>
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 307622284239..66fe814c8725 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -6492,7 +6492,7 @@ static int ufshcd_abort(struct scsi_cmnd *cmd) /* command completed already */ dev_err(hba->dev, "%s: cmd at tag %d successfully cleared from DB.\n", __func__, tag); - goto out; + goto cleanup; } else { dev_err(hba->dev, "%s: no response from device. tag = %d, err %d\n", @@ -6526,6 +6526,7 @@ static int ufshcd_abort(struct scsi_cmnd *cmd) goto out; } +cleanup: scsi_dma_unmap(cmd); spin_lock_irqsave(host->host_lock, flags);