Re: [PATCH] timer: Prevent base->clk from moving backward

From: Anna-Maria Behnsen
Date: Thu Jul 09 2020 - 05:42:45 EST


Hi,

On Fri, 3 Jul 2020, Frederic Weisbecker wrote:

> When a timer is enqueued with a negative delta (ie: expiry is below
> base->clk), it gets added to the wheel as expiring now (base->clk).
>
> Yet the value that gets stored in base->next_expiry, while calling
> trigger_dyntick_cpu(), is the initial timer->expires value. The
> resulting state becomes:
>
> base->next_expiry < base->clk
>
> On the next timer enqueue, forward_timer_base() may accidentally
> rewind base->clk. As a possible outcome, timers may expire way too
> early, the worst case being that the highest wheel levels get spuriously
> processed again.
>
> To prevent from that, make sure that base->next_expiry doesn't get below
> base->clk.
>
> Fixes: a683f390b93f ("timers: Forward the wheel clock whenever possible")
> Signed-off-by: Frederic Weisbecker <frederic@xxxxxxxxxx>
> Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
> Cc: Anna-Maria Gleixner <anna-maria@xxxxxxxxxxxxx>
> Cc: Juri Lelli <juri.lelli@xxxxxxxxxx>
> ---

Reviewed-by: Anna-Maria Behnsen <anna-maria@xxxxxxxxxxxxx>

Thanks,

Anna-Maria