diff options
Diffstat (limited to 'arch/x86/include/asm/trace')
| -rw-r--r-- | arch/x86/include/asm/trace/exceptions.h | 52 | ||||
| -rw-r--r-- | arch/x86/include/asm/trace/irq_vectors.h | 11 | 
2 files changed, 63 insertions, 0 deletions
diff --git a/arch/x86/include/asm/trace/exceptions.h b/arch/x86/include/asm/trace/exceptions.h new file mode 100644 index 00000000000..2fbc66c7885 --- /dev/null +++ b/arch/x86/include/asm/trace/exceptions.h @@ -0,0 +1,52 @@ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM exceptions + +#if !defined(_TRACE_PAGE_FAULT_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_PAGE_FAULT_H + +#include <linux/tracepoint.h> + +extern void trace_irq_vector_regfunc(void); +extern void trace_irq_vector_unregfunc(void); + +DECLARE_EVENT_CLASS(x86_exceptions, + +	TP_PROTO(unsigned long address, struct pt_regs *regs, +		 unsigned long error_code), + +	TP_ARGS(address, regs, error_code), + +	TP_STRUCT__entry( +		__field(		unsigned long, address	) +		__field(		unsigned long, ip	) +		__field(		unsigned long, error_code ) +	), + +	TP_fast_assign( +		__entry->address = address; +		__entry->ip = regs->ip; +		__entry->error_code = error_code; +	), + +	TP_printk("address=%pf ip=%pf error_code=0x%lx", +		  (void *)__entry->address, (void *)__entry->ip, +		  __entry->error_code) ); + +#define DEFINE_PAGE_FAULT_EVENT(name)				\ +DEFINE_EVENT_FN(x86_exceptions, name,				\ +	TP_PROTO(unsigned long address,	struct pt_regs *regs,	\ +		 unsigned long error_code),			\ +	TP_ARGS(address, regs, error_code),			\ +	trace_irq_vector_regfunc,				\ +	trace_irq_vector_unregfunc); + +DEFINE_PAGE_FAULT_EVENT(page_fault_user); +DEFINE_PAGE_FAULT_EVENT(page_fault_kernel); + +#undef TRACE_INCLUDE_PATH +#define TRACE_INCLUDE_PATH . +#define TRACE_INCLUDE_FILE exceptions +#endif /*  _TRACE_PAGE_FAULT_H */ + +/* This part must be outside protection */ +#include <trace/define_trace.h> diff --git a/arch/x86/include/asm/trace/irq_vectors.h b/arch/x86/include/asm/trace/irq_vectors.h index 2874df24e7a..4cab890007a 100644 --- a/arch/x86/include/asm/trace/irq_vectors.h +++ b/arch/x86/include/asm/trace/irq_vectors.h @@ -72,6 +72,17 @@ DEFINE_IRQ_VECTOR_EVENT(x86_platform_ipi);  DEFINE_IRQ_VECTOR_EVENT(irq_work);  /* + * We must dis-allow sampling irq_work_exit() because perf event sampling + * itself can cause irq_work, which would lead to an infinite loop; + * + *  1) irq_work_exit happens + *  2) generates perf sample + *  3) generates irq_work + *  4) goto 1 + */ +TRACE_EVENT_PERF_PERM(irq_work_exit, is_sampling_event(p_event) ? -EPERM : 0); + +/*   * call_function - called when entering/exiting a call function interrupt   * vector handler   */  | 
