On 2022/11/29 9:14, Yu Kuai wrote: > Hi, > > 在 2022/11/29 3:58, Tejun Heo 写道: >> On Mon, Nov 28, 2022 at 11:04:13AM +0800, Li Jinlin wrote: >>> /* calculate the current delay in effect - 1/2 every second */ >>> tdelta = now->now - iocg->delay_at; >>> if (iocg->delay) >>> - delay = iocg->delay >> div64_u64(tdelta, USEC_PER_SEC); >>> + delay = iocg->delay >> >>> + min_t(u64, div64_u64(tdelta, USEC_PER_SEC), 63); >> >> I replied earlier but the right thing to do here is setting delay to 0 if >> the shift is >= 64. > > Perhaps following change will make more sense? > > @@ -1322,18 +1323,19 @@ static bool iocg_kick_delay(struct ioc_gq *iocg, struct ioc_now *now) > { > struct ioc *ioc = iocg->ioc; > struct blkcg_gq *blkg = iocg_to_blkg(iocg); > - u64 tdelta, delay, new_delay; > + u64 delay = 0; > + u64 new_delay; > s64 vover, vover_pct; > u32 hwa; > > lockdep_assert_held(&iocg->waitq.lock); > > /* calculate the current delay in effect - 1/2 every second */ > - tdelta = now->now - iocg->delay_at; > - if (iocg->delay) > + if (iocg->delay && now->now > iocg->delay_at) { > + u64 tdelta = now->now - iocg->delay_at; > + > delay = iocg->delay >> div64_u64(tdelta, USEC_PER_SEC); > - else > - delay = 0; > + } > I think "now->now > iocg->delay_at" is unnecessary, it is almost inevitable. What about the following change for setting delay to 0 if the shift is >= 64. @@ -1329,11 +1329,9 @@ static bool iocg_kick_delay(struct ioc_gq *iocg, struct ioc_now *now) lockdep_assert_held(&iocg->waitq.lock); /* calculate the current delay in effect - 1/2 every second */ - tdelta = now->now - iocg->delay_at; if (iocg->delay) - delay = iocg->delay >> div64_u64(tdelta, USEC_PER_SEC); - else - delay = 0; + tdelta = div64_u64(now->now - iocg->delay_at, USEC_PER_SEC); + delay = (iocg->delay && tdelta < 64) ? iocg->delay >> tdelta : 0; /* calculate the new delay from the debt amount */ current_hweight(iocg, &hwa, NULL); Jinlin Thanks. >> >> Thanks. >> >