From: Peter Zijlstra <peterz@infradead.org> To: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, rostedt@goodmis.org Cc: peterz@infradead.org, mingo@kernel.org, joel@joelfernandes.org, gregkh@linuxfoundation.org, gustavo@embeddedor.com, tglx@linutronix.de, paulmck@kernel.org, josh@joshtriplett.org, mathieu.desnoyers@efficios.com, jiangshanlai@gmail.com, luto@kernel.org, tony.luck@intel.com, frederic@kernel.org, dan.carpenter@oracle.com, mhiramat@kernel.org, Will Deacon <will@kernel.org>, Marc Zyngier <maz@kernel.org>, Michael Ellerman <mpe@ellerman.id.au>, Petr Mladek <pmladek@suse.com> Subject: [PATCH v3 01/22] hardirq/nmi: Allow nested nmi_enter() Date: Wed, 19 Feb 2020 15:47:25 +0100 Message-ID: <20200219150744.428764577@infradead.org> (raw) In-Reply-To: <20200219144724.800607165@infradead.org> Since there are already a number of sites (ARM64, PowerPC) that effectively nest nmi_enter(), lets make the primitive support this before adding even more. Cc: Will Deacon <will@kernel.org> Cc: Marc Zyngier <maz@kernel.org> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Petr Mladek <pmladek@suse.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> --- arch/arm64/include/asm/hardirq.h | 4 ++-- arch/arm64/kernel/sdei.c | 14 ++------------ arch/arm64/kernel/traps.c | 8 ++------ arch/powerpc/kernel/traps.c | 19 +++++-------------- include/linux/hardirq.h | 2 +- include/linux/preempt.h | 4 ++-- kernel/printk/printk_safe.c | 6 ++++-- 7 files changed, 18 insertions(+), 39 deletions(-) --- a/arch/arm64/include/asm/hardirq.h +++ b/arch/arm64/include/asm/hardirq.h @@ -38,7 +38,7 @@ DECLARE_PER_CPU(struct nmi_ctx, nmi_cont #define arch_nmi_enter() \ do { \ - if (is_kernel_in_hyp_mode()) { \ + if (is_kernel_in_hyp_mode() && !in_nmi()) { \ struct nmi_ctx *nmi_ctx = this_cpu_ptr(&nmi_contexts); \ nmi_ctx->hcr = read_sysreg(hcr_el2); \ if (!(nmi_ctx->hcr & HCR_TGE)) { \ @@ -50,7 +50,7 @@ DECLARE_PER_CPU(struct nmi_ctx, nmi_cont #define arch_nmi_exit() \ do { \ - if (is_kernel_in_hyp_mode()) { \ + if (is_kernel_in_hyp_mode() && !in_nmi()) { \ struct nmi_ctx *nmi_ctx = this_cpu_ptr(&nmi_contexts); \ if (!(nmi_ctx->hcr & HCR_TGE)) \ write_sysreg(nmi_ctx->hcr, hcr_el2); \ --- a/arch/arm64/kernel/sdei.c +++ b/arch/arm64/kernel/sdei.c @@ -251,22 +251,12 @@ asmlinkage __kprobes notrace unsigned lo __sdei_handler(struct pt_regs *regs, struct sdei_registered_event *arg) { unsigned long ret; - bool do_nmi_exit = false; - /* - * nmi_enter() deals with printk() re-entrance and use of RCU when - * RCU believed this CPU was idle. Because critical events can - * interrupt normal events, we may already be in_nmi(). - */ - if (!in_nmi()) { - nmi_enter(); - do_nmi_exit = true; - } + nmi_enter(); ret = _sdei_handler(regs, arg); - if (do_nmi_exit) - nmi_exit(); + nmi_exit(); return ret; } --- a/arch/arm64/kernel/traps.c +++ b/arch/arm64/kernel/traps.c @@ -906,17 +906,13 @@ bool arm64_is_fatal_ras_serror(struct pt asmlinkage void do_serror(struct pt_regs *regs, unsigned int esr) { - const bool was_in_nmi = in_nmi(); - - if (!was_in_nmi) - nmi_enter(); + nmi_enter(); /* non-RAS errors are not containable */ if (!arm64_is_ras_serror(esr) || arm64_is_fatal_ras_serror(regs, esr)) arm64_serror_panic(regs, esr); - if (!was_in_nmi) - nmi_exit(); + nmi_exit(); } asmlinkage void enter_from_user_mode(void) --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c @@ -441,15 +441,9 @@ void hv_nmi_check_nonrecoverable(struct void system_reset_exception(struct pt_regs *regs) { unsigned long hsrr0, hsrr1; - bool nested = in_nmi(); bool saved_hsrrs = false; - /* - * Avoid crashes in case of nested NMI exceptions. Recoverability - * is determined by RI and in_nmi - */ - if (!nested) - nmi_enter(); + nmi_enter(); /* * System reset can interrupt code where HSRRs are live and MSR[RI]=1. @@ -521,8 +515,7 @@ void system_reset_exception(struct pt_re mtspr(SPRN_HSRR1, hsrr1); } - if (!nested) - nmi_exit(); + nmi_exit(); /* What should we do here? We could issue a shutdown or hard reset. */ } @@ -823,9 +816,8 @@ int machine_check_generic(struct pt_regs void machine_check_exception(struct pt_regs *regs) { int recover = 0; - bool nested = in_nmi(); - if (!nested) - nmi_enter(); + + nmi_enter(); __this_cpu_inc(irq_stat.mce_exceptions); @@ -863,8 +855,7 @@ void machine_check_exception(struct pt_r return; bail: - if (!nested) - nmi_exit(); + nmi_exit(); } void SMIException(struct pt_regs *regs) --- a/include/linux/hardirq.h +++ b/include/linux/hardirq.h @@ -71,7 +71,7 @@ extern void irq_exit(void); printk_nmi_enter(); \ lockdep_off(); \ ftrace_nmi_enter(); \ - BUG_ON(in_nmi()); \ + BUG_ON(in_nmi() == NMI_MASK); \ preempt_count_add(NMI_OFFSET + HARDIRQ_OFFSET); \ rcu_nmi_enter(); \ trace_hardirq_enter(); \ --- a/include/linux/preempt.h +++ b/include/linux/preempt.h @@ -26,13 +26,13 @@ * PREEMPT_MASK: 0x000000ff * SOFTIRQ_MASK: 0x0000ff00 * HARDIRQ_MASK: 0x000f0000 - * NMI_MASK: 0x00100000 + * NMI_MASK: 0x00f00000 * PREEMPT_NEED_RESCHED: 0x80000000 */ #define PREEMPT_BITS 8 #define SOFTIRQ_BITS 8 #define HARDIRQ_BITS 4 -#define NMI_BITS 1 +#define NMI_BITS 4 #define PREEMPT_SHIFT 0 #define SOFTIRQ_SHIFT (PREEMPT_SHIFT + PREEMPT_BITS) --- a/kernel/printk/printk_safe.c +++ b/kernel/printk/printk_safe.c @@ -296,12 +296,14 @@ static __printf(1, 0) int vprintk_nmi(co void notrace printk_nmi_enter(void) { - this_cpu_or(printk_context, PRINTK_NMI_CONTEXT_MASK); + if (!in_nmi()) + this_cpu_or(printk_context, PRINTK_NMI_CONTEXT_MASK); } void notrace printk_nmi_exit(void) { - this_cpu_and(printk_context, ~PRINTK_NMI_CONTEXT_MASK); + if (!in_nmi()) + this_cpu_and(printk_context, ~PRINTK_NMI_CONTEXT_MASK); } /*
next prev parent reply index Thread overview: 99+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-02-19 14:47 [PATCH v3 00/22] tracing vs world Peter Zijlstra 2020-02-19 14:47 ` Peter Zijlstra [this message] 2020-02-19 15:31 ` [PATCH v3 01/22] hardirq/nmi: Allow nested nmi_enter() Steven Rostedt 2020-02-19 16:56 ` Borislav Petkov 2020-02-19 17:07 ` Peter Zijlstra 2020-02-20 8:41 ` Will Deacon 2020-02-20 9:19 ` Marc Zyngier 2020-02-20 13:18 ` Petr Mladek 2020-02-19 14:47 ` [PATCH v3 02/22] x86,mce: Delete ist_begin_non_atomic() Peter Zijlstra 2020-02-19 17:13 ` Borislav Petkov 2020-02-19 17:21 ` Andy Lutomirski 2020-02-19 17:33 ` Peter Zijlstra 2020-02-19 22:12 ` Andy Lutomirski 2020-02-19 22:33 ` Luck, Tony 2020-02-19 22:48 ` Andy Lutomirski 2020-02-20 7:39 ` Peter Zijlstra 2020-02-19 17:42 ` Borislav Petkov 2020-02-19 17:46 ` Peter Zijlstra 2020-02-19 14:47 ` [PATCH v3 03/22] x86: Replace ist_enter() with nmi_enter() Peter Zijlstra 2020-02-20 10:54 ` Borislav Petkov 2020-02-20 12:11 ` Peter Zijlstra 2020-02-19 14:47 ` [PATCH v3 04/22] x86/doublefault: Make memmove() notrace/NOKPROBE Peter Zijlstra 2020-02-19 15:36 ` Steven Rostedt 2020-02-19 15:40 ` Peter Zijlstra 2020-02-19 15:55 ` Steven Rostedt 2020-02-19 15:57 ` Peter Zijlstra 2020-02-19 16:04 ` Peter Zijlstra 2020-02-19 16:12 ` Steven Rostedt 2020-02-19 16:27 ` Paul E. McKenney 2020-02-19 16:34 ` Peter Zijlstra 2020-02-19 16:46 ` Paul E. McKenney 2020-02-19 17:05 ` Steven Rostedt 2020-02-20 12:17 ` Borislav Petkov 2020-02-20 12:37 ` Peter Zijlstra 2020-02-19 15:47 ` Steven Rostedt 2020-02-19 14:47 ` [PATCH v3 05/22] rcu: Make RCU IRQ enter/exit functions rely on in_nmi() Peter Zijlstra 2020-02-19 16:31 ` Paul E. McKenney 2020-02-19 16:37 ` Peter Zijlstra 2020-02-19 16:45 ` Paul E. McKenney 2020-02-19 17:03 ` Peter Zijlstra 2020-02-19 17:42 ` Paul E. McKenney 2020-02-19 17:16 ` [PATCH] rcu/kprobes: Comment why rcu_nmi_enter() is marked NOKPROBE Steven Rostedt 2020-02-19 17:18 ` Joel Fernandes 2020-02-19 17:41 ` Paul E. McKenney 2020-02-20 5:54 ` Masami Hiramatsu 2020-02-19 14:47 ` [PATCH v3 06/22] rcu: Rename rcu_irq_{enter,exit}_irqson() Peter Zijlstra 2020-02-19 16:38 ` Paul E. McKenney 2020-02-19 14:47 ` [PATCH v3 07/22] rcu: Mark rcu_dynticks_curr_cpu_in_eqs() inline Peter Zijlstra 2020-02-19 16:39 ` Paul E. McKenney 2020-02-19 17:19 ` Steven Rostedt 2020-02-19 14:47 ` [PATCH v3 08/22] rcu,tracing: Create trace_rcu_{enter,exit}() Peter Zijlstra 2020-02-19 15:49 ` Steven Rostedt 2020-02-19 15:58 ` Peter Zijlstra 2020-02-19 16:15 ` Steven Rostedt 2020-02-19 16:35 ` Peter Zijlstra 2020-02-19 16:44 ` Paul E. McKenney 2020-02-20 10:34 ` Peter Zijlstra 2020-02-20 13:58 ` Paul E. McKenney 2020-02-19 14:47 ` [PATCH v3 09/22] sched,rcu,tracing: Avoid tracing before in_nmi() is correct Peter Zijlstra 2020-02-19 15:50 ` Steven Rostedt 2020-02-19 15:50 ` Steven Rostedt 2020-02-19 14:47 ` [PATCH v3 10/22] x86,tracing: Add comments to do_nmi() Peter Zijlstra 2020-02-19 15:51 ` Steven Rostedt 2020-02-19 14:47 ` [PATCH v3 11/22] perf,tracing: Prepare the perf-trace interface for RCU changes Peter Zijlstra 2020-02-19 14:47 ` [PATCH v3 12/22] tracing: Employ trace_rcu_{enter,exit}() Peter Zijlstra 2020-02-19 15:52 ` Steven Rostedt 2020-02-19 14:47 ` [PATCH v3 13/22] tracing: Remove regular RCU context for _rcuidle tracepoints (again) Peter Zijlstra 2020-02-19 15:53 ` Steven Rostedt 2020-02-19 16:43 ` Paul E. McKenney 2020-02-19 16:47 ` Peter Zijlstra 2020-02-19 17:05 ` Peter Zijlstra 2020-02-19 17:21 ` Steven Rostedt 2020-02-19 17:40 ` Paul E. McKenney 2020-02-19 18:00 ` Steven Rostedt 2020-02-19 19:05 ` Paul E. McKenney 2020-02-19 14:47 ` [PATCH v3 14/22] perf,tracing: Allow function tracing when !RCU Peter Zijlstra 2020-02-19 14:47 ` [PATCH v3 15/22] x86/int3: Ensure that poke_int3_handler() is not traced Peter Zijlstra 2020-02-19 14:47 ` [PATCH v3 16/22] locking/atomics, kcsan: Add KCSAN instrumentation Peter Zijlstra 2020-02-19 15:46 ` Steven Rostedt 2020-02-19 16:03 ` Peter Zijlstra 2020-02-19 16:50 ` Paul E. McKenney 2020-02-19 16:54 ` Peter Zijlstra 2020-02-19 17:36 ` Paul E. McKenney 2020-02-19 14:47 ` [PATCH v3 17/22] asm-generic/atomic: Use __always_inline for pure wrappers Peter Zijlstra 2020-02-19 14:47 ` [PATCH v3 18/22] asm-generic/atomic: Use __always_inline for fallback wrappers Peter Zijlstra 2020-02-19 16:55 ` Paul E. McKenney 2020-02-19 17:06 ` Peter Zijlstra 2020-02-19 17:35 ` Paul E. McKenney 2020-02-19 14:47 ` [PATCH v3 19/22] compiler: Simple READ/WRITE_ONCE() implementations Peter Zijlstra 2020-02-19 14:47 ` [PATCH v3 20/22] locking/atomics: Flip fallbacks and instrumentation Peter Zijlstra 2020-02-19 14:47 ` [PATCH v3 21/22] x86/int3: Avoid atomic instrumentation Peter Zijlstra 2020-02-19 14:47 ` [PATCH v3 22/22] x86/int3: Ensure that poke_int3_handler() is not sanitized Peter Zijlstra 2020-02-19 16:06 ` Dmitry Vyukov 2020-02-19 16:30 ` Peter Zijlstra 2020-02-19 16:51 ` Peter Zijlstra 2020-02-19 17:20 ` Peter Zijlstra 2020-02-20 10:37 ` Dmitry Vyukov 2020-02-20 12:06 ` Peter Zijlstra 2020-02-20 16:22 ` Dmitry Vyukov
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200219150744.428764577@infradead.org \ --to=peterz@infradead.org \ --cc=dan.carpenter@oracle.com \ --cc=frederic@kernel.org \ --cc=gregkh@linuxfoundation.org \ --cc=gustavo@embeddedor.com \ --cc=jiangshanlai@gmail.com \ --cc=joel@joelfernandes.org \ --cc=josh@joshtriplett.org \ --cc=linux-arch@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=luto@kernel.org \ --cc=mathieu.desnoyers@efficios.com \ --cc=maz@kernel.org \ --cc=mhiramat@kernel.org \ --cc=mingo@kernel.org \ --cc=mpe@ellerman.id.au \ --cc=paulmck@kernel.org \ --cc=pmladek@suse.com \ --cc=rostedt@goodmis.org \ --cc=tglx@linutronix.de \ --cc=tony.luck@intel.com \ --cc=will@kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
LKML Archive on lore.kernel.org Archives are clonable: git clone --mirror https://lore.kernel.org/lkml/0 lkml/git/0.git git clone --mirror https://lore.kernel.org/lkml/1 lkml/git/1.git git clone --mirror https://lore.kernel.org/lkml/2 lkml/git/2.git git clone --mirror https://lore.kernel.org/lkml/3 lkml/git/3.git git clone --mirror https://lore.kernel.org/lkml/4 lkml/git/4.git git clone --mirror https://lore.kernel.org/lkml/5 lkml/git/5.git git clone --mirror https://lore.kernel.org/lkml/6 lkml/git/6.git git clone --mirror https://lore.kernel.org/lkml/7 lkml/git/7.git git clone --mirror https://lore.kernel.org/lkml/8 lkml/git/8.git git clone --mirror https://lore.kernel.org/lkml/9 lkml/git/9.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 lkml lkml/ https://lore.kernel.org/lkml \ linux-kernel@vger.kernel.org public-inbox-index lkml Example config snippet for mirrors Newsgroup available over NNTP: nntp://nntp.lore.kernel.org/org.kernel.vger.linux-kernel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git