On Thu, Aug 12 2021 at 16:11, Thomas Gleixner wrote: > On Thu, Aug 12 2021 at 09:19, Mike Galbraith wrote: >> Greetings Peter, may your day get off to a better start than my box's >> did :) >> >> On Tue, 2021-08-10 at 16:02 +0000, tip-bot2 for Peter Zijlstra wrote: >>> The following commit has been merged into the timers/core branch of tip: >>> >>> Commit-ID: b14bca97c9f5c3e3f133445b01c723e95490d843 >>> Gitweb: https://git.kernel.org/tip/b14bca97c9f5c3e3f133445b01c723e95490d843 >>> Author: Peter Zijlstra <peterz@xxxxxxxxxxxxx> >>> AuthorDate: Tue, 13 Jul 2021 15:39:47 +02:00 >>> Committer: Thomas Gleixner <tglx@xxxxxxxxxxxxx> >>> CommitterDate: Tue, 10 Aug 2021 17:57:22 +02:00 >>> >>> hrtimer: Consolidate reprogramming code >> >> Per git-bisect, this is the tip.today commit that's bricking my box >> early in boot. > > Let me stare at that. Can you please test whether the below fixes it for you? I have yet to find a machine which reproduces it as I really want to understand which particular part is causing this. 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,