UML time-travel warning from __run_timers

Thomas Gleixner tglx at linutronix.de
Sun Apr 3 16:23:01 PDT 2022


Johannes,

On Sun, Apr 03 2022 at 19:19, Johannes Berg wrote:
> Actually, in a sense, this *is* the case of (just) recalculating
> next_expiry, no? We just never set next_expiry_recalc since there was
> never any timer on this?

why are you insisting on fishing in the dark? 

> So actually this also makes the warning go away:
>
> --- a/kernel/time/timer.c
> +++ b/kernel/time/timer.c
> @@ -1729,6 +1733,7 @@ static inline void __run_timers(struct timer_base *base)
>  		WARN_ON_ONCE(!levels && !base->next_expiry_recalc);
>  		base->clk++;
>  		base->next_expiry = __next_timer_interrupt(base);
> +		base->next_expiry_recalc = !levels;

You are papering over the problem. That makes the warnign go away, but
does not explain anyhting about the root cause. Can you please provide
the information which was asked for?

>  		while (levels--)
>  			expire_timers(base, heads + levels);
> @@ -2005,6 +2010,7 @@ static void __init init_timer_cpu(int cpu)
>  		raw_spin_lock_init(&base->lock);
>  		base->clk = jiffies;
>  		base->next_expiry = base->clk + NEXT_TIMER_MAX_DELTA;
> +		base->next_expiry_recalc = true;

This is complete nonsense because at the point where the CPU base is
initialized next_expiry _IS_ correct at the outer max. Why would it be
required to be recalculated? The only reason why it needs to be
recalculated is when a timer is canceled before expiry, but there is
_NO_ timer which can be canceled at this point.

So what are you trying to solve here?

Thanks,

        tglx



More information about the linux-um mailing list