mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 13:55:32 +00:00
![Steven Rostedt (Red Hat)](/assets/img/avatar_default.png)
As NMIs can also cause latency when interrupts are disabled, the hwlat detectory has no way to know if the latency it detects is from an NMI or an SMI or some other hardware glitch. As ftrace_nmi_enter/exit() funtions are no longer used (except for sh, which isn't supported anymore), I converted those to "arch_ftrace_nmi_enter/exit" and use ftrace_nmi_enter/exit() to check if hwlat detector is tracing or not, and if so, it calls into the hwlat utility. Since the hwlat detector only has a single kthread that is spinning with interrupts disabled, it marks what CPU it is on, and if the NMI callback happens on that CPU, it records the time spent in that NMI. This is added to the output that is generated by the hwlat detector as: #3 inner/outer(us): 9/9 ts:1470836488.206734548 #4 inner/outer(us): 0/8 ts:1470836497.140808588 #5 inner/outer(us): 0/6 ts:1470836499.140825168 nmi-total:5 nmi-count:1 #6 inner/outer(us): 9/9 ts:1470836501.140841748 All time is still tracked in microseconds. The NMI information is only shown when an NMI occurred during the sample. Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
36 lines
784 B
C
36 lines
784 B
C
#ifndef _LINUX_FTRACE_IRQ_H
|
|
#define _LINUX_FTRACE_IRQ_H
|
|
|
|
|
|
#ifdef CONFIG_FTRACE_NMI_ENTER
|
|
extern void arch_ftrace_nmi_enter(void);
|
|
extern void arch_ftrace_nmi_exit(void);
|
|
#else
|
|
static inline void arch_ftrace_nmi_enter(void) { }
|
|
static inline void arch_ftrace_nmi_exit(void) { }
|
|
#endif
|
|
|
|
#ifdef CONFIG_HWLAT_TRACER
|
|
extern bool trace_hwlat_callback_enabled;
|
|
extern void trace_hwlat_callback(bool enter);
|
|
#endif
|
|
|
|
static inline void ftrace_nmi_enter(void)
|
|
{
|
|
#ifdef CONFIG_HWLAT_TRACER
|
|
if (trace_hwlat_callback_enabled)
|
|
trace_hwlat_callback(true);
|
|
#endif
|
|
arch_ftrace_nmi_enter();
|
|
}
|
|
|
|
static inline void ftrace_nmi_exit(void)
|
|
{
|
|
arch_ftrace_nmi_exit();
|
|
#ifdef CONFIG_HWLAT_TRACER
|
|
if (trace_hwlat_callback_enabled)
|
|
trace_hwlat_callback(false);
|
|
#endif
|
|
}
|
|
|
|
#endif /* _LINUX_FTRACE_IRQ_H */
|