Messages in this thread | | | Date | Wed, 15 Jul 2020 14:40:55 +0200 | From | Frederic Weisbecker <> | Subject | Re: [PATCH v2] timers: Use only bucket expiry for base->next_expiry value |
| |
On Tue, Jul 14, 2020 at 09:29:24AM +0200, Anna-Maria Behnsen wrote: > The bucket expiry time is the effective expriy time of timers and is > greater than or equal to the requested timer expiry time. This is due > to the guarantee that timers never expire early and the reduced expiry > granularity in the secondary wheel levels. > > When a timer is enqueued, trigger_dyntick_cpu() checks whether the > timer is the new first timer. This check compares next_expiry with > the requested timer expiry value and not with the effective expiry > value of the bucket into which the timer was queued. > > Storing the requested timer expiry value in base->next_expiry can lead > to base->clk going backwards if the requested timer expiry value is > smaller than base->clk. Commit 30c66fc30ee7 ("timer: Prevent base->clk > from moving backward") worked around this by preventing the store when > timer->expiry is before base->clk, but did not fix the underlying > problem. > > Use the expiry value of the bucket into which the timer is queued to > do the new first timer check. This fixes the base->clk going backward > problem. > > The workaround of commit 30c66fc30ee7 ("timer: Prevent base->clk from > moving backward") in trigger_dyntick_cpu() is not longer necessary as the > timers bucket expiry is guaranteed to be greater than or equal base->clk. > > Signed-off-by: Anna-Maria Behnsen <anna-maria@linutronix.de>
Reviewed-by: Frederic Weisbecker <frederic@kernel.org>
Thanks a lot!
| |