Hi Avri, On Sun, 2020-05-31 at 07:10 +0000, Avri Altman wrote: > > > > Currently ref-clk control timeout is implemented by Jiffies. However > > jiffies is not accurate enough thus "false timeout" may happen. > > > > Use more accurate delay mechanism instead, for example, ktime. > > > > Signed-off-by: Stanley Chu <stanley.chu@xxxxxxxxxxxx> > > Reviewed-by: Andy Teng <andy.teng@xxxxxxxxxxxx> > Reviewed-by: Avri Altman <avri.altman@xxxxxxx> > Thanks for your review. > > > > /* Wait for ack */ > > - timeout = jiffies + msecs_to_jiffies(REFCLK_REQ_TIMEOUT_MS); > > + timeout = ktime_add_us(ktime_get(), REFCLK_REQ_TIMEOUT_US); > > do { > > + time_checked = ktime_get(); > > value = ufshcd_readl(hba, REG_UFS_REFCLK_CTRL); > > > > /* Wait until ack bit equals to req bit */ > > @@ -144,7 +145,7 @@ static int ufs_mtk_setup_ref_clk(struct ufs_hba *hba, > > bool on) > > goto out; > > > > usleep_range(100, 200); > > - } while (time_before(jiffies, timeout)); > > + } while (ktime_before(time_checked, timeout)); > Nit: you could get rid of time_checked if you would use ktime_compare(ktime_get(), timeout) > 0 > > Thanks, > Avri If this context is preempted and scheduled out between ufshcd_readl() and ktime_compare(ktime_get(), timeout), then the ktime_get() may get a "timed-out" time even though the last ufshcd_readl() is actually executed before the "timed-out" time. In this case, false alarm will show up. Using "time_checked" here could solve above issue. Thanks, Stanley Chu