Messages in this thread Patch in this message | | | From | Thomas Gleixner <> | Subject | Re: [patch V4 part 2 10/18] x86/entry/64: Check IF in __preempt_enable_notrace() thunk | Date | Mon, 11 May 2020 20:27:00 +0200 |
| |
Thomas Gleixner <tglx@linutronix.de> writes: > Thomas Gleixner <tglx@linutronix.de> writes: >> Let me stare into that again. > > There are a few preempt_disable/enable() pairs in some of the helper > functions which are called in various places. That means we would have > to chase all of them and provide 'naked' helpers for these particular > call chains. I'll fix the changelog and add a comment to make clear what > this is about.
I actually sat down and chased it. It's mostly the tracing code - again, particularly the hardware latency tracer. There is really no point to invoke that from the guts of nmi_enter() and nmi_exit().
Neither for #DB, #BP nor #MCE there is a reason to invoke that at all. If someone does hardware latency analysis then #DB and #BP should not be in use at all. If so, shrug. If #MCE hits, then the hardware induced latency is the least of the worries.
So the only relevant place is actually NMI which wants to be tracked to avoid false positives. But that tracking really can wait to the point where the NMI has actually reached halfways stable state.
The other place which as preempt_disable/enable_notrace() in it is rcu_is_watching() but it's trivial enough to provide a naked version for that.
Thanks,
tglx
8<------------------ Subject: nmi, tracing: Provide nmi_enter/exit_notrace() From: Thomas Gleixner <tglx@linutronix.de> Date: Mon, 11 May 2020 10:57:16 +0200
To fully isolate #DB and #BP from instrumentable code it's necessary to avoid invoking the hardware latency tracer on nmi_enter/exit().
Provide nmi_enter/exit() variants which are not invoking the hardware latency tracer. That allows to put calls explicitely into the call sites outside of the kprobe handling.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- V5: New patch --- include/linux/hardirq.h | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-)
--- a/include/linux/hardirq.h +++ b/include/linux/hardirq.h @@ -77,28 +77,38 @@ extern void irq_exit(void); /* * nmi_enter() can nest up to 15 times; see NMI_BITS. */ -#define nmi_enter() \ +#define nmi_enter_notrace() \ do { \ arch_nmi_enter(); \ printk_nmi_enter(); \ lockdep_off(); \ - ftrace_nmi_enter(); \ BUG_ON(in_nmi() == NMI_MASK); \ __preempt_count_add(NMI_OFFSET + HARDIRQ_OFFSET); \ rcu_nmi_enter(); \ lockdep_hardirq_enter(); \ } while (0) -#define nmi_exit() \ +#define nmi_enter() \ + do { \ + nmi_enter_notrace(); \ + ftrace_nmi_enter(); \ + } while (0) + +#define nmi_exit_notrace() \ do { \ lockdep_hardirq_exit(); \ rcu_nmi_exit(); \ BUG_ON(!in_nmi()); \ __preempt_count_sub(NMI_OFFSET + HARDIRQ_OFFSET); \ - ftrace_nmi_exit(); \ lockdep_on(); \ printk_nmi_exit(); \ arch_nmi_exit(); \ } while (0) +#define nmi_exit() \ + do { \ + ftrace_nmi_exit(); \ + nmi_exit_notrace(); \ + } while (0) + #endif /* LINUX_HARDIRQ_H */
| |