On 2013-10-15 20:58, Wei Liu wrote: > On Tue, Oct 15, 2013 at 07:26:31PM +0800, jianhai luan wrote: > [...] >>>>> Can you propose a patch? >>>> Because credit_timeout.expire always after jiffies, i judge the >>>> value over the range of time_after_eq() by time_before(now, >>>> vif->credit_timeout.expires). please check the patch. >>> I don't think this really fix the issue for you. You still have chance >>> that now wraps around and falls between expires and next_credit. In that >>> case it's stalled again. >> if time_before(now, vif->credit_timeout.expires) is true, time wrap >> and do operation. Otherwise time_before(now, >> vif->credit_timeout.expires) isn't true, now - >> vif->credit_timeout.expires should be letter than ULONG_MAX/2. >> Because next_credit large than vif->credit_timeout.expires >> (next_crdit = vif->credit_timeout.expires + >> msecs_to_jiffies(vif->credit_usec/1000)), the delta between now and >> next_credit should be in range of time_after_eq(). So >> time_after_eq() do correctly judge. >> > Not sure I understand you. Consider "now" is placed like this: > > expires now next_credit > ----time increases this direction---> > > * time_after_eq(now, next_credit) -> false > * time_before(now, expires) -> false > > Then it's stuck again. You're merely narrowing the window, not fixing > the real problem. The above environment isn't stack again. The netback will pending one timer to process the environment. The attachment program will prove if !(time_after_eq(now, next_credit) || time_before(now, vif->credit_timeout.expires)), now will only be placed in above environment [ expires next_credit), and the above environment will be processed by timer in soon. > > Wei. > >> Jason >>> Wei. Jason.