> -----Original Message----- > From: Bart Van Assche <bvanassche@xxxxxxx> > Sent: Tuesday, January 23, 2024 5:37 AM > To: SEO HOYOUNG <hy50.seo@xxxxxxxxxxx>; linux-scsi@xxxxxxxxxxxxxxx; linux- > kernel@xxxxxxxxxxxxxxx; alim.akhtar@xxxxxxxxxxx; avri.altman@xxxxxxx; > jejb@xxxxxxxxxxxxx; martin.petersen@xxxxxxxxxx; beanhuo@xxxxxxxxxx; > kwangwon.min@xxxxxxxxxxx; kwmad.kim@xxxxxxxxxxx; sh425.lee@xxxxxxxxxxx; > sc.suh@xxxxxxxxxxx; quic_nguyenb@xxxxxxxxxxx; cpgs@xxxxxxxxxxx; > grant.jung@xxxxxxxxxxx; junwoo80.lee@xxxxxxxxxxx > Subject: Re: [PATCH v1] scsi: ufs: core: Remove the ufshcd_release in > ufshcd_err_handling_prepare > > On 1/22/24 00:33, SEO HOYOUNG wrote: > > If err_handler is performed in the suspend/resume situation, > > ufs_release can be called twice and active_reqs valid can be negative. > > This is because ufshcd_errhandling_prepare() and > > ufshcd_err_handling_unprepare() repeatedly release calls. > > Eventually, active_reqs have a value different from the intention. > > To prevent this, release duplication processing was removed. > > > > Signed-off-by: SEO HOYOUNG <hy50.seo@xxxxxxxxxxx> > > --- > > drivers/ufs/core/ufshcd.c | 1 - > > 1 file changed, 1 deletion(-) > > > > diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c > > index 7c59d7a02243..423e83074a20 100644 > > --- a/drivers/ufs/core/ufshcd.c > > +++ b/drivers/ufs/core/ufshcd.c > > @@ -6351,7 +6351,6 @@ static void ufshcd_err_handling_prepare(struct > ufs_hba *hba) > > ufshcd_hold(hba); > > if (!ufshcd_is_clkgating_allowed(hba)) > > ufshcd_setup_clocks(hba, true); > > - ufshcd_release(hba); > > pm_op = hba->is_sys_suspended ? UFS_SYSTEM_PM : > UFS_RUNTIME_PM; > > ufshcd_vops_resume(hba, pm_op); > > } else { > > I think that the above ufshcd_release() call pairs with the ufshcd_hold() > call three lines above it and hence that removing that call would be wrong. > > Thanks, > > Bart. Hi, It was a different when I tested it. If __ufshcd_wl_resume() is called active_reqs is 1. Because ufshcd_hold() is called in __ufshcd_wl_suspend(). If occurred hibern8_exit failed in __ufschd_wl_resume(), ufshcd_release() is called in the :out syntax, and active_reqs becomes 0. After that, active_reqs becomes 0 because ufshcd_hold() is called from ufshcd_err_handling_repare()and ufshcd_release() is called again while err_handler is operating. When err_handler is completed, active_reqs becomes negative because ufshcd_release() is called again in ufshcd_err_handling_unprepare(). I tested it while printing the log, and if I misanalyzed it, let me know. Thanks, SEO.