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
![]() |