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.
|
* 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
|
#ifndef DECLARE_TRACE
|
||||||
|
|
||||||
#define TP_PROTO(args...) args
|
#define TP_PROTO(args...) args
|
||||||
|
@ -96,9 +155,6 @@ struct tracepoint {
|
||||||
#define EXPORT_TRACEPOINT_SYMBOL(name) \
|
#define EXPORT_TRACEPOINT_SYMBOL(name) \
|
||||||
EXPORT_SYMBOL(__tracepoint_##name)
|
EXPORT_SYMBOL(__tracepoint_##name)
|
||||||
|
|
||||||
extern void tracepoint_update_probe_range(struct tracepoint *begin,
|
|
||||||
struct tracepoint *end);
|
|
||||||
|
|
||||||
#else /* !CONFIG_TRACEPOINTS */
|
#else /* !CONFIG_TRACEPOINTS */
|
||||||
#define DECLARE_TRACE(name, proto, args) \
|
#define DECLARE_TRACE(name, proto, args) \
|
||||||
static inline void _do_trace_##name(struct tracepoint *tp, proto) \
|
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_GPL(name)
|
||||||
#define EXPORT_TRACEPOINT_SYMBOL(name)
|
#define EXPORT_TRACEPOINT_SYMBOL(name)
|
||||||
|
|
||||||
static inline void tracepoint_update_probe_range(struct tracepoint *begin,
|
|
||||||
struct tracepoint *end)
|
|
||||||
{ }
|
|
||||||
#endif /* CONFIG_TRACEPOINTS */
|
#endif /* CONFIG_TRACEPOINTS */
|
||||||
#endif /* DECLARE_TRACE */
|
#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
|
#ifndef TRACE_EVENT
|
||||||
/*
|
/*
|
||||||
* For use with the TRACE_EVENT macro:
|
* For use with the TRACE_EVENT macro:
|
||||||
|
|
|
@ -65,6 +65,10 @@
|
||||||
|
|
||||||
#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
|
#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
|
#ifdef CONFIG_EVENT_TRACING
|
||||||
#include <trace/ftrace.h>
|
#include <trace/ftrace.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -75,6 +79,7 @@
|
||||||
#undef DEFINE_EVENT
|
#undef DEFINE_EVENT
|
||||||
#undef DEFINE_EVENT_PRINT
|
#undef DEFINE_EVENT_PRINT
|
||||||
#undef TRACE_HEADER_MULTI_READ
|
#undef TRACE_HEADER_MULTI_READ
|
||||||
|
#undef DECLARE_TRACE
|
||||||
|
|
||||||
/* Only undef what we defined in this file */
|
/* Only undef what we defined in this file */
|
||||||
#ifdef UNDEF_TRACE_INCLUDE_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_
|
#define _TRACE_NAPI_H_
|
||||||
|
|
||||||
#include <linux/netdevice.h>
|
#include <linux/netdevice.h>
|
||||||
|
@ -8,4 +11,7 @@ DECLARE_TRACE(napi_poll,
|
||||||
TP_PROTO(struct napi_struct *napi),
|
TP_PROTO(struct napi_struct *napi),
|
||||||
TP_ARGS(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