Re: [RFC PATCH 04/11] Add a function to start/reduce a timer

From: Thomas Gleixner
Date: Fri Oct 20 2017 - 08:20:48 EST


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