diff options
Diffstat (limited to 'include/linux/tracepoint.h')
| -rw-r--r-- | include/linux/tracepoint.h | 19 | 
1 files changed, 15 insertions, 4 deletions
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index 4b33b95eb8be..e299f29375bb 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h @@ -178,6 +178,17 @@ static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p)  #endif /* CONFIG_HAVE_STATIC_CALL */  /* + * ARCH_WANTS_NO_INSTR archs are expected to have sanitized entry and idle + * code that disallow any/all tracing/instrumentation when RCU isn't watching. + */ +#ifdef CONFIG_ARCH_WANTS_NO_INSTR +#define RCUIDLE_COND(rcuidle)	(rcuidle) +#else +/* srcu can't be used from NMI */ +#define RCUIDLE_COND(rcuidle)	(rcuidle && in_nmi()) +#endif + +/*   * it_func[0] is never NULL because there is at least one element in the array   * when the array itself is non NULL.   */ @@ -188,8 +199,8 @@ static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p)  		if (!(cond))						\  			return;						\  									\ -		/* srcu can't be used from NMI */			\ -		WARN_ON_ONCE(rcuidle && in_nmi());			\ +		if (WARN_ON_ONCE(RCUIDLE_COND(rcuidle)))		\ +			return;						\  									\  		/* keep srcu and sched-rcu usage consistent */		\  		preempt_disable_notrace();				\ @@ -471,7 +482,7 @@ static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p)   *	* This is how the trace record is structured and will   *	* be saved into the ring buffer. These are the fields   *	* that will be exposed to user-space in - *	* /sys/kernel/debug/tracing/events/<*>/format. + *	* /sys/kernel/tracing/events/<*>/format.   *	*   *	* The declared 'local variable' is called '__entry'   *	* @@ -531,7 +542,7 @@ static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p)   * tracepoint callback (this is used by programmatic plugins and   * can also by used by generic instrumentation like SystemTap), and   * it is also used to expose a structured trace record in - * /sys/kernel/debug/tracing/events/. + * /sys/kernel/tracing/events/.   *   * A set of (un)registration functions can be passed to the variant   * TRACE_EVENT_FN to perform any (un)registration work.  |