Re: [tip: timers/core] hrtimer: Consolidate reprogramming code
From: Mike Galbraith
Date: Thu Aug 12 2021 - 11:04:18 EST
On Thu, 2021-08-12 at 16:32 +0200, Thomas Gleixner wrote:
>
> Can you please test whether the below fixes it for you?
Yes, that boots.
> I have yet to find a machine which reproduces it as I really want to
> understand which particular part is causing this.
Config attached just in case.
> Thanks,
>
> tglx
> ---
> --- a/kernel/time/hrtimer.c
> +++ b/kernel/time/hrtimer.c
> @@ -652,24 +652,10 @@ static inline int hrtimer_hres_active(vo
> return __hrtimer_hres_active(this_cpu_ptr(&hrtimer_bases));
> }
>
> -static void
> -__hrtimer_reprogram(struct hrtimer_cpu_base *cpu_base, int skip_equal,
> - struct hrtimer *next_timer, ktime_t expires_next)
> +static void __hrtimer_reprogram(struct hrtimer_cpu_base *cpu_base,
> + struct hrtimer *next_timer,
> + ktime_t expires_next)
> {
> - /*
> - * If the hrtimer interrupt is running, then it will reevaluate
> the
> - * clock bases and reprogram the clock event device.
> - */
> - if (cpu_base->in_hrtirq)
> - return;
> -
> - if (expires_next > cpu_base->expires_next)
> - return;
> -
> - if (skip_equal && expires_next == cpu_base->expires_next)
> - return;
> -
> - cpu_base->next_timer = next_timer;
> cpu_base->expires_next = expires_next;
>
> /*
> @@ -707,8 +693,10 @@ hrtimer_force_reprogram(struct hrtimer_c
>
> expires_next = hrtimer_update_next_event(cpu_base);
>
> - __hrtimer_reprogram(cpu_base, skip_equal, cpu_base->next_timer,
> - expires_next);
> + if (skip_equal && expires_next == cpu_base->expires_next)
> + return;
> +
> + __hrtimer_reprogram(cpu_base, cpu_base->next_timer,
> expires_next);
> }
>
> /* High resolution timer related functions */
> @@ -863,7 +851,19 @@ static void hrtimer_reprogram(struct hrt
> if (base->cpu_base != cpu_base)
> return;
>
> - __hrtimer_reprogram(cpu_base, true, timer, expires);
> + if (expires >= cpu_base->expires_next)
> + return;
> +
> + /*
> + * If the hrtimer interrupt is running, then it will reevaluate
> the
> + * clock bases and reprogram the clock event device.
> + */
> + if (cpu_base->in_hrtirq)
> + return;
> +
> + cpu_base->next_timer = timer;
> +
> + __hrtimer_reprogram(cpu_base, timer, expires);
> }
>
> static bool update_needs_ipi(struct hrtimer_cpu_base *cpu_base,
Attachment:
config.gz
Description: application/gzip