Messages in this thread | | | Date | Mon, 19 Oct 2020 17:18:03 +0800 | From | Can Guo <> | Subject | Re: [PATCH v2] scsi: ufs: fix clkgating on/off correctly |
| |
On 2020-10-17 05:18, jaegeuk@kernel.org wrote: > The below call stack prevents clk_gating at every IO completion. > We can remove the condition, ufshcd_any_tag_in_use(), since > clkgating_work > will check it again.
Thanks for fixing it, actually we have noticed this for a while. It used to work well, please add a Fixes tag or mention the commit which breaks clk gating functionality - the commit which introduces func ufshcd_any_tag_in_use().
Regards,
Can Guo.
> > ufshcd_complete_requests(struct ufs_hba *hba) > ufshcd_transfer_req_compl() > __ufshcd_transfer_req_compl() > __ufshcd_release(hba) > if (ufshcd_any_tag_in_use() == 1) > return; > ufshcd_tmc_handler(hba); > blk_mq_tagset_busy_iter(); > > In addition, we have to avoid gate_work, if it was disabled. > > Cc: Alim Akhtar <alim.akhtar@samsung.com> > Cc: Avri Altman <avri.altman@wdc.com> > Cc: Can Guo <cang@codeaurora.org> > Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> > --- > > Change log from v1: > - change the patch subject > - fix clkgate.is_enable to work > > drivers/scsi/ufs/ufshcd.c | 5 +++-- > drivers/scsi/ufs/ufshcd.h | 5 +++++ > 2 files changed, 8 insertions(+), 2 deletions(-) > > diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c > index a2db8182663d..75e8a76f20c7 100644 > --- a/drivers/scsi/ufs/ufshcd.c > +++ b/drivers/scsi/ufs/ufshcd.c > @@ -1729,9 +1729,10 @@ static void __ufshcd_release(struct ufs_hba > *hba) > > if (hba->clk_gating.active_reqs || hba->clk_gating.is_suspended > || hba->ufshcd_state != UFSHCD_STATE_OPERATIONAL > - || ufshcd_any_tag_in_use(hba) || hba->outstanding_tasks > + || hba->outstanding_tasks > || hba->active_uic_cmd || hba->uic_async_done > - || ufshcd_eh_in_progress(hba)) > + || ufshcd_eh_in_progress(hba) > + || ufshcd_is_clkgating_enabled(hba)) > return; > > hba->clk_gating.state = REQ_CLKS_OFF; > diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h > index 8344d8cb3678..09e59cb86e69 100644 > --- a/drivers/scsi/ufs/ufshcd.h > +++ b/drivers/scsi/ufs/ufshcd.h > @@ -814,6 +814,11 @@ static inline bool > ufshcd_is_auto_hibern8_supported(struct ufs_hba *hba) > !(hba->quirks & UFSHCD_QUIRK_BROKEN_AUTO_HIBERN8); > } > > +static inline bool ufshcd_is_clkgating_enabled(struct ufs_hba *hba) > +{ > + return hba->clk_gating.is_enabled; > +} > + > static inline bool ufshcd_is_auto_hibern8_enabled(struct ufs_hba *hba) > { > return FIELD_GET(UFSHCI_AHIBERN8_TIMER_MASK, hba->ahit) ? true : > false;
| |