On Wed, Jan 06, 2021 at 09:41:02AM -0800, Paul E. McKenney wrote: > The "Timeout: Not all CPUs entered broadcast exception handler" message > will appear from time to time given enough systems, but this message does > not identify which CPUs failed to enter the broadcast exception handler. > This information would be valuable if available, for example, in order to > correlated with other hardware-oriented error messages.
Because you're expecting that the CPUs which have not entered the exception handler might have stuck earlier and that's the correlation there? > This commit That's a tautology. :) > therefore maintains a cpumask_t of CPUs that have entered this handler, > and prints out which ones failed to enter in the event of a timeout. > Build-tested only. > > Cc: Tony Luck <tony.l...@intel.com> > Cc: Borislav Petkov <b...@alien8.de> > Cc: Thomas Gleixner <t...@linutronix.de> > Cc: Ingo Molnar <mi...@redhat.com> > Cc: "H. Peter Anvin" <h...@zytor.com> > Cc: <x...@kernel.org> > Cc: <linux-e...@vger.kernel.org> > Reported-by: Jonathan Lemon <b...@fb.com> > Signed-off-by: Paul E. McKenney <paul...@kernel.org> > > diff --git a/arch/x86/kernel/cpu/mce/core.c b/arch/x86/kernel/cpu/mce/core.c > index 13d3f1c..44d2b99 100644 > --- a/arch/x86/kernel/cpu/mce/core.c > +++ b/arch/x86/kernel/cpu/mce/core.c > @@ -878,6 +878,12 @@ static atomic_t mce_executing; > static atomic_t mce_callin; > > /* > + * Track which CPUs entered and not in order to print holdouts. > + */ > +static cpumask_t mce_present_cpus; > +static cpumask_t mce_missing_cpus; > + > +/* > * Check if a timeout waiting for other CPUs happened. > */ > static int mce_timed_out(u64 *t, const char *msg) > @@ -894,8 +900,12 @@ static int mce_timed_out(u64 *t, const char *msg) > if (!mca_cfg.monarch_timeout) > goto out; > if ((s64)*t < SPINUNIT) { > - if (mca_cfg.tolerant <= 1) > + if (mca_cfg.tolerant <= 1) { > + if (!cpumask_andnot(&mce_missing_cpus, cpu_online_mask, > &mce_present_cpus)) > + pr_info("%s: MCE holdout CPUs: %*pbl\n", > + __func__, > cpumask_pr_args(&mce_missing_cpus)); > mce_panic(msg, NULL, NULL); > + } > cpu_missing = 1; > return 1; > } > @@ -1006,6 +1016,7 @@ static int mce_start(int *no_way_out) > * is updated before mce_callin. > */ > order = atomic_inc_return(&mce_callin); Doesn't a single mce_callin_mask suffice? -- Regards/Gruss, Boris. https://people.kernel.org/tglx/notes-about-netiquette