On Fri, 1 Sep 2017, David Howells wrote: > Add a function, similar to mod_timer(), that will start a timer it isn't s/it /if it / > running and will modify it if it is running and has an expiry time longer > than the new time. If the timer is running with an expiry time that's the > same or sooner, no change is made. > > The function looks like: > > int reduce_timer(struct timer_list *timer, unsigned long expires); Well, yes. But what's the purpose of this function? You explain the what, but not the why. > +extern int reduce_timer(struct timer_list *timer, unsigned long expires); For new timer functions we really should use the timer_xxxx() convention. The historic naming convention is horrible. Aside of that timer_reduce() is kinda ugly but I failed to come up with something reasonable as well. > static inline int > -__mod_timer(struct timer_list *timer, unsigned long expires, bool pending_only) > +__mod_timer(struct timer_list *timer, unsigned long expires, unsigned int options) > { > struct timer_base *base, *new_base; > unsigned int idx = UINT_MAX; > @@ -938,8 +941,13 @@ __mod_timer(struct timer_list *timer, unsigned long expires, bool pending_only) > * same array bucket then just return: > */ > if (timer_pending(timer)) { > - if (timer->expires == expires) > - return 1; > + if (options & MOD_TIMER_REDUCE) { > + if (time_before_eq(timer->expires, expires)) > + return 1; > + } else { > + if (timer->expires == expires) > + return 1; > + } This hurts the common networking optimzation case. Please keep that check first: if (timer->expires == expires) return 1; if ((options & MOD_TIMER_REDUCE) && time_before(timer->expires, expires)) return 1; Also please check whether it's more efficient code wise to have that option thing or if an additional 'bool reduce' argument cerates better code. Thanks, tglx