tracing: Fix tracepoint.h DECLARE_TRACE() to allow more than one header
When more than one header is included under CREATE_TRACE_POINTS the DECLARE_TRACE() macro is not defined back to its original meaning and the second include will fail to initialize the TRACE_EVENT() and DECLARE_TRACE() correctly. To fix this the tracepoint.h file moves the define of DECLARE_TRACE() out of the #ifdef _LINUX_TRACEPOINT_H protection (just like the define of the TRACE_EVENT()). This way the define_trace.h will undef the DECLARE_TRACE() at the end and allow new headers to start from scratch. This patch also requires fixing the include/events/napi.h It currently uses DECLARE_TRACE() and should be converted to a TRACE_EVENT() format. But I'll leave that change to the authors of that file. But since the napi.h file depends on using the CREATE_TRACE_POINTS and does not define its own DEFINE_TRACE() it must use the define_trace.h method instead. Cc: Neil Horman <nhorman@tuxdriver.com> Cc: David S. Miller <davem@davemloft.net> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
		
							parent
							
								
									03d646e62b
								
							
						
					
					
						commit
						2e26ca7150
					
				| @ -33,6 +33,65 @@ struct tracepoint { | ||||
| 					 * Keep in sync with vmlinux.lds.h. | ||||
| 					 */ | ||||
| 
 | ||||
| /*
 | ||||
|  * Connect a probe to a tracepoint. | ||||
|  * Internal API, should not be used directly. | ||||
|  */ | ||||
| extern int tracepoint_probe_register(const char *name, void *probe); | ||||
| 
 | ||||
| /*
 | ||||
|  * Disconnect a probe from a tracepoint. | ||||
|  * Internal API, should not be used directly. | ||||
|  */ | ||||
| extern int tracepoint_probe_unregister(const char *name, void *probe); | ||||
| 
 | ||||
| extern int tracepoint_probe_register_noupdate(const char *name, void *probe); | ||||
| extern int tracepoint_probe_unregister_noupdate(const char *name, void *probe); | ||||
| extern void tracepoint_probe_update_all(void); | ||||
| 
 | ||||
| struct tracepoint_iter { | ||||
| 	struct module *module; | ||||
| 	struct tracepoint *tracepoint; | ||||
| }; | ||||
| 
 | ||||
| extern void tracepoint_iter_start(struct tracepoint_iter *iter); | ||||
| extern void tracepoint_iter_next(struct tracepoint_iter *iter); | ||||
| extern void tracepoint_iter_stop(struct tracepoint_iter *iter); | ||||
| extern void tracepoint_iter_reset(struct tracepoint_iter *iter); | ||||
| extern int tracepoint_get_iter_range(struct tracepoint **tracepoint, | ||||
| 	struct tracepoint *begin, struct tracepoint *end); | ||||
| 
 | ||||
| /*
 | ||||
|  * tracepoint_synchronize_unregister must be called between the last tracepoint | ||||
|  * probe unregistration and the end of module exit to make sure there is no | ||||
|  * caller executing a probe when it is freed. | ||||
|  */ | ||||
| static inline void tracepoint_synchronize_unregister(void) | ||||
| { | ||||
| 	synchronize_sched(); | ||||
| } | ||||
| 
 | ||||
| #define PARAMS(args...) args | ||||
| 
 | ||||
| #ifdef CONFIG_TRACEPOINTS | ||||
| extern void tracepoint_update_probe_range(struct tracepoint *begin, | ||||
| 	struct tracepoint *end); | ||||
| #else | ||||
| static inline void tracepoint_update_probe_range(struct tracepoint *begin, | ||||
| 	struct tracepoint *end) | ||||
| { } | ||||
| #endif /* CONFIG_TRACEPOINTS */ | ||||
| 
 | ||||
| #endif /* _LINUX_TRACEPOINT_H */ | ||||
| 
 | ||||
| /*
 | ||||
|  * Note: we keep the TRACE_EVENT and DECLARE_TRACE outside the include | ||||
|  *  file ifdef protection. | ||||
|  *  This is due to the way trace events work. If a file includes two | ||||
|  *  trace event headers under one "CREATE_TRACE_POINTS" the first include | ||||
|  *  will override the TRACE_EVENT and break the second include. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef DECLARE_TRACE | ||||
| 
 | ||||
| #define TP_PROTO(args...)	args | ||||
| @ -96,9 +155,6 @@ struct tracepoint { | ||||
| #define EXPORT_TRACEPOINT_SYMBOL(name)					\ | ||||
| 	EXPORT_SYMBOL(__tracepoint_##name) | ||||
| 
 | ||||
| extern void tracepoint_update_probe_range(struct tracepoint *begin, | ||||
| 	struct tracepoint *end); | ||||
| 
 | ||||
| #else /* !CONFIG_TRACEPOINTS */ | ||||
| #define DECLARE_TRACE(name, proto, args)				\ | ||||
| 	static inline void _do_trace_##name(struct tracepoint *tp, proto) \ | ||||
| @ -119,61 +175,9 @@ extern void tracepoint_update_probe_range(struct tracepoint *begin, | ||||
| #define EXPORT_TRACEPOINT_SYMBOL_GPL(name) | ||||
| #define EXPORT_TRACEPOINT_SYMBOL(name) | ||||
| 
 | ||||
| static inline void tracepoint_update_probe_range(struct tracepoint *begin, | ||||
| 	struct tracepoint *end) | ||||
| { } | ||||
| #endif /* CONFIG_TRACEPOINTS */ | ||||
| #endif /* DECLARE_TRACE */ | ||||
| 
 | ||||
| /*
 | ||||
|  * Connect a probe to a tracepoint. | ||||
|  * Internal API, should not be used directly. | ||||
|  */ | ||||
| extern int tracepoint_probe_register(const char *name, void *probe); | ||||
| 
 | ||||
| /*
 | ||||
|  * Disconnect a probe from a tracepoint. | ||||
|  * Internal API, should not be used directly. | ||||
|  */ | ||||
| extern int tracepoint_probe_unregister(const char *name, void *probe); | ||||
| 
 | ||||
| extern int tracepoint_probe_register_noupdate(const char *name, void *probe); | ||||
| extern int tracepoint_probe_unregister_noupdate(const char *name, void *probe); | ||||
| extern void tracepoint_probe_update_all(void); | ||||
| 
 | ||||
| struct tracepoint_iter { | ||||
| 	struct module *module; | ||||
| 	struct tracepoint *tracepoint; | ||||
| }; | ||||
| 
 | ||||
| extern void tracepoint_iter_start(struct tracepoint_iter *iter); | ||||
| extern void tracepoint_iter_next(struct tracepoint_iter *iter); | ||||
| extern void tracepoint_iter_stop(struct tracepoint_iter *iter); | ||||
| extern void tracepoint_iter_reset(struct tracepoint_iter *iter); | ||||
| extern int tracepoint_get_iter_range(struct tracepoint **tracepoint, | ||||
| 	struct tracepoint *begin, struct tracepoint *end); | ||||
| 
 | ||||
| /*
 | ||||
|  * tracepoint_synchronize_unregister must be called between the last tracepoint | ||||
|  * probe unregistration and the end of module exit to make sure there is no | ||||
|  * caller executing a probe when it is freed. | ||||
|  */ | ||||
| static inline void tracepoint_synchronize_unregister(void) | ||||
| { | ||||
| 	synchronize_sched(); | ||||
| } | ||||
| 
 | ||||
| #define PARAMS(args...) args | ||||
| 
 | ||||
| #endif /* _LINUX_TRACEPOINT_H */ | ||||
| 
 | ||||
| /*
 | ||||
|  * Note: we keep the TRACE_EVENT outside the include file ifdef protection. | ||||
|  *  This is due to the way trace events work. If a file includes two | ||||
|  *  trace event headers under one "CREATE_TRACE_POINTS" the first include | ||||
|  *  will override the TRACE_EVENT and break the second include. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef TRACE_EVENT | ||||
| /*
 | ||||
|  * For use with the TRACE_EVENT macro: | ||||
|  | ||||
| @ -65,6 +65,10 @@ | ||||
| 
 | ||||
| #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) | ||||
| 
 | ||||
| /* Make all open coded DECLARE_TRACE nops */ | ||||
| #undef DECLARE_TRACE | ||||
| #define DECLARE_TRACE(name, proto, args) | ||||
| 
 | ||||
| #ifdef CONFIG_EVENT_TRACING | ||||
| #include <trace/ftrace.h> | ||||
| #endif | ||||
| @ -75,6 +79,7 @@ | ||||
| #undef DEFINE_EVENT | ||||
| #undef DEFINE_EVENT_PRINT | ||||
| #undef TRACE_HEADER_MULTI_READ | ||||
| #undef DECLARE_TRACE | ||||
| 
 | ||||
| /* Only undef what we defined in this file */ | ||||
| #ifdef UNDEF_TRACE_INCLUDE_FILE | ||||
|  | ||||
| @ -1,4 +1,7 @@ | ||||
| #ifndef _TRACE_NAPI_H_ | ||||
| #undef TRACE_SYSTEM | ||||
| #define TRACE_SYSTEM napi | ||||
| 
 | ||||
| #if !defined(_TRACE_NAPI_H) || defined(TRACE_HEADER_MULTI_READ) | ||||
| #define _TRACE_NAPI_H_ | ||||
| 
 | ||||
| #include <linux/netdevice.h> | ||||
| @ -8,4 +11,7 @@ DECLARE_TRACE(napi_poll, | ||||
| 	TP_PROTO(struct napi_struct *napi), | ||||
| 	TP_ARGS(napi)); | ||||
| 
 | ||||
| #endif | ||||
| #endif /* _TRACE_NAPI_H_ */ | ||||
| 
 | ||||
| /* This part must be outside protection */ | ||||
| #include <trace/define_trace.h> | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user