diff options
Diffstat (limited to 'include/linux/tracepoint.h')
| -rw-r--r-- | include/linux/tracepoint.h | 44 | 
1 files changed, 29 insertions, 15 deletions
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index 7f2e16e76ac4..538ba1a58f5b 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h @@ -99,6 +99,29 @@ extern void syscall_unregfunc(void);  #define TRACE_DEFINE_ENUM(x)  #define TRACE_DEFINE_SIZEOF(x) +#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS +static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p) +{ +	return offset_to_ptr(p); +} + +#define __TRACEPOINT_ENTRY(name)					\ +	asm("	.section \"__tracepoints_ptrs\", \"a\"		\n"	\ +	    "	.balign 4					\n"	\ +	    "	.long 	__tracepoint_" #name " - .		\n"	\ +	    "	.previous					\n") +#else +static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p) +{ +	return *p; +} + +#define __TRACEPOINT_ENTRY(name)					 \ +	static tracepoint_ptr_t __tracepoint_ptr_##name __used		 \ +	__attribute__((section("__tracepoints_ptrs"))) =		 \ +		&__tracepoint_##name +#endif +  #endif /* _LINUX_TRACEPOINT_H */  /* @@ -158,8 +181,10 @@ extern void syscall_unregfunc(void);  		 * For rcuidle callers, use srcu since sched-rcu	\  		 * doesn't work from the idle path.			\  		 */							\ -		if (rcuidle)						\ +		if (rcuidle) {						\  			idx = srcu_read_lock_notrace(&tracepoint_srcu);	\ +			rcu_irq_enter_irqson();				\ +		}							\  									\  		it_func_ptr = rcu_dereference_raw((tp)->funcs);		\  									\ @@ -171,8 +196,10 @@ extern void syscall_unregfunc(void);  			} while ((++it_func_ptr)->func);		\  		}							\  									\ -		if (rcuidle)						\ +		if (rcuidle) {						\ +			rcu_irq_exit_irqson();				\  			srcu_read_unlock_notrace(&tracepoint_srcu, idx);\ +		}							\  									\  		preempt_enable_notrace();				\  	} while (0) @@ -249,19 +276,6 @@ extern void syscall_unregfunc(void);  		return static_key_false(&__tracepoint_##name.key);	\  	} -#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS -#define __TRACEPOINT_ENTRY(name)					\ -	asm("	.section \"__tracepoints_ptrs\", \"a\"		\n"	\ -	    "	.balign 4					\n"	\ -	    "	.long 	__tracepoint_" #name " - .		\n"	\ -	    "	.previous					\n") -#else -#define __TRACEPOINT_ENTRY(name)					 \ -	static struct tracepoint * const __tracepoint_ptr_##name __used	 \ -	__attribute__((section("__tracepoints_ptrs"))) =		 \ -		&__tracepoint_##name -#endif -  /*   * We have no guarantee that gcc and the linker won't up-align the tracepoint   * structures, so we create an array of pointers that will be used for iteration  | 
