Messages in this thread | | | Date | Tue, 18 Feb 2020 13:11:58 -0500 | From | Steven Rostedt <> | Subject | Re: [RFC] #MC mess |
| |
On Tue, 18 Feb 2020 18:31:50 +0100 Borislav Petkov <bp@alien8.de> wrote:
> Ok, > > so Peter raised this question on IRC today, that the #MC handler needs > to disable all kinds of tracing/kprobing and etc exceptions happening > while handling an #MC. And I guess we can talk about supporting some > exceptions but #MC is usually nasty enough to not care about tracing > when former happens.
What's the issue with tracing? Does this affect the tracing done by the edac_mc_handle_error code?
It has a trace event in it, that the rasdaemon uses.
> > So how about this trivial first stab of using the big hammer and simply > turning off stuff? The nmi_enter()/nmi_exit() thing still needs debating > because ist_enter() already does rcu_nmi_enter() and I'm not sure > whether any of the context tracking would still be ok with that. > > Anything else I'm missing? It is likely... > > Thx. > > --- > diff --git a/arch/x86/kernel/cpu/mce/core.c b/arch/x86/kernel/cpu/mce/core.c > index 2c4f949611e4..6dff97c53310 100644 > --- a/arch/x86/kernel/cpu/mce/core.c > +++ b/arch/x86/kernel/cpu/mce/core.c > @@ -1214,7 +1214,7 @@ static void __mc_scan_banks(struct mce *m, struct mce *final, > * MCE broadcast. However some CPUs might be broken beyond repair, > * so be always careful when synchronizing with others. > */ > -void do_machine_check(struct pt_regs *regs, long error_code) > +void notrace do_machine_check(struct pt_regs *regs, long error_code) > { > DECLARE_BITMAP(valid_banks, MAX_NR_BANKS); > DECLARE_BITMAP(toclear, MAX_NR_BANKS); > @@ -1251,6 +1251,10 @@ void do_machine_check(struct pt_regs *regs, long error_code) > if (__mc_check_crashing_cpu(cpu)) > return; > > + hw_breakpoint_disable(); > + static_key_disable(&__tracepoint_read_msr.key);
I believe static_key_disable() sleeps, and does all kinds of crazing things (like update the code).
-- Steve
> + tracing_off(); > + > ist_enter(regs); > > this_cpu_inc(mce_exception_count); > @@ -1360,6 +1364,7 @@ void do_machine_check(struct pt_regs *regs, long error_code) > ist_exit(regs); > } > EXPORT_SYMBOL_GPL(do_machine_check); > +NOKPROBE_SYMBOL(do_machine_check); > > #ifndef CONFIG_MEMORY_FAILURE > int memory_failure(unsigned long pfn, int flags) >
| |