Commit 9533ac62 authored by Ingo Molnar's avatar Ingo Molnar

Merge branch 'tip/perf/core' of...

Merge branch 'tip/perf/core' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace into perf/core
parents fe612672 75ec29ab
...@@ -280,6 +280,12 @@ static inline void tracepoint_synchronize_unregister(void) ...@@ -280,6 +280,12 @@ static inline void tracepoint_synchronize_unregister(void)
* TRACE_EVENT_FN to perform any (un)registration work. * TRACE_EVENT_FN to perform any (un)registration work.
*/ */
#define TRACE_EVENT_TEMPLATE(name, proto, args, tstruct, assign, print)
#define DEFINE_EVENT(template, name, proto, args) \
DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \
DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
#define TRACE_EVENT(name, proto, args, struct, assign, print) \ #define TRACE_EVENT(name, proto, args, struct, assign, print) \
DECLARE_TRACE(name, PARAMS(proto), PARAMS(args)) DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
#define TRACE_EVENT_FN(name, proto, args, struct, \ #define TRACE_EVENT_FN(name, proto, args, struct, \
......
...@@ -31,6 +31,14 @@ ...@@ -31,6 +31,14 @@
assign, print, reg, unreg) \ assign, print, reg, unreg) \
DEFINE_TRACE_FN(name, reg, unreg) DEFINE_TRACE_FN(name, reg, unreg)
#undef DEFINE_EVENT
#define DEFINE_EVENT(template, name, proto, args) \
DEFINE_TRACE(name)
#undef DEFINE_EVENT_PRINT
#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \
DEFINE_TRACE(name)
#undef DECLARE_TRACE #undef DECLARE_TRACE
#define DECLARE_TRACE(name, proto, args) \ #define DECLARE_TRACE(name, proto, args) \
DEFINE_TRACE(name) DEFINE_TRACE(name)
...@@ -63,6 +71,9 @@ ...@@ -63,6 +71,9 @@
#undef TRACE_EVENT #undef TRACE_EVENT
#undef TRACE_EVENT_FN #undef TRACE_EVENT_FN
#undef TRACE_EVENT_TEMPLATE
#undef DEFINE_EVENT
#undef DEFINE_EVENT_PRINT
#undef TRACE_HEADER_MULTI_READ #undef TRACE_HEADER_MULTI_READ
/* Only undef what we defined in this file */ /* Only undef what we defined in this file */
......
...@@ -83,7 +83,7 @@ TRACE_EVENT(sched_wait_task, ...@@ -83,7 +83,7 @@ TRACE_EVENT(sched_wait_task,
* (NOTE: the 'rq' argument is not used by generic trace events, * (NOTE: the 'rq' argument is not used by generic trace events,
* but used by the latency tracer plugin. ) * but used by the latency tracer plugin. )
*/ */
TRACE_EVENT(sched_wakeup, TRACE_EVENT_TEMPLATE(sched_wakeup_template,
TP_PROTO(struct rq *rq, struct task_struct *p, int success), TP_PROTO(struct rq *rq, struct task_struct *p, int success),
...@@ -110,38 +110,19 @@ TRACE_EVENT(sched_wakeup, ...@@ -110,38 +110,19 @@ TRACE_EVENT(sched_wakeup,
__entry->success, __entry->target_cpu) __entry->success, __entry->target_cpu)
); );
DEFINE_EVENT(sched_wakeup_template, sched_wakeup,
TP_PROTO(struct rq *rq, struct task_struct *p, int success),
TP_ARGS(rq, p, success));
/* /*
* Tracepoint for waking up a new task: * Tracepoint for waking up a new task:
* *
* (NOTE: the 'rq' argument is not used by generic trace events, * (NOTE: the 'rq' argument is not used by generic trace events,
* but used by the latency tracer plugin. ) * but used by the latency tracer plugin. )
*/ */
TRACE_EVENT(sched_wakeup_new, DEFINE_EVENT(sched_wakeup_template, sched_wakeup_new,
TP_PROTO(struct rq *rq, struct task_struct *p, int success), TP_PROTO(struct rq *rq, struct task_struct *p, int success),
TP_ARGS(rq, p, success));
TP_ARGS(rq, p, success),
TP_STRUCT__entry(
__array( char, comm, TASK_COMM_LEN )
__field( pid_t, pid )
__field( int, prio )
__field( int, success )
__field( int, target_cpu )
),
TP_fast_assign(
memcpy(__entry->comm, p->comm, TASK_COMM_LEN);
__entry->pid = p->pid;
__entry->prio = p->prio;
__entry->success = success;
__entry->target_cpu = task_cpu(p);
),
TP_printk("comm=%s pid=%d prio=%d success=%d target_cpu=%03d",
__entry->comm, __entry->pid, __entry->prio,
__entry->success, __entry->target_cpu)
);
/* /*
* Tracepoint for task switches, performed by the scheduler: * Tracepoint for task switches, performed by the scheduler:
...@@ -216,10 +197,7 @@ TRACE_EVENT(sched_migrate_task, ...@@ -216,10 +197,7 @@ TRACE_EVENT(sched_migrate_task,
__entry->orig_cpu, __entry->dest_cpu) __entry->orig_cpu, __entry->dest_cpu)
); );
/* TRACE_EVENT_TEMPLATE(sched_process_template,
* Tracepoint for freeing a task:
*/
TRACE_EVENT(sched_process_free,
TP_PROTO(struct task_struct *p), TP_PROTO(struct task_struct *p),
...@@ -242,29 +220,19 @@ TRACE_EVENT(sched_process_free, ...@@ -242,29 +220,19 @@ TRACE_EVENT(sched_process_free,
); );
/* /*
* Tracepoint for a task exiting: * Tracepoint for freeing a task:
*/ */
TRACE_EVENT(sched_process_exit, DEFINE_EVENT(sched_process_template, sched_process_free,
TP_PROTO(struct task_struct *p), TP_PROTO(struct task_struct *p),
TP_ARGS(p));
TP_ARGS(p),
TP_STRUCT__entry( /*
__array( char, comm, TASK_COMM_LEN ) * Tracepoint for a task exiting:
__field( pid_t, pid ) */
__field( int, prio ) DEFINE_EVENT(sched_process_template, sched_process_exit,
), TP_PROTO(struct task_struct *p),
TP_ARGS(p));
TP_fast_assign(
memcpy(__entry->comm, p->comm, TASK_COMM_LEN);
__entry->pid = p->pid;
__entry->prio = p->prio;
),
TP_printk("comm=%s pid=%d prio=%d",
__entry->comm, __entry->pid, __entry->prio)
);
/* /*
* Tracepoint for a waiting task: * Tracepoint for a waiting task:
...@@ -348,12 +316,7 @@ TRACE_EVENT(sched_signal_send, ...@@ -348,12 +316,7 @@ TRACE_EVENT(sched_signal_send,
* XXX the below sched_stat tracepoints only apply to SCHED_OTHER/BATCH/IDLE * XXX the below sched_stat tracepoints only apply to SCHED_OTHER/BATCH/IDLE
* adding sched_stat support to SCHED_FIFO/RR would be welcome. * adding sched_stat support to SCHED_FIFO/RR would be welcome.
*/ */
TRACE_EVENT_TEMPLATE(sched_stat_template,
/*
* Tracepoint for accounting wait time (time the task is runnable
* but not actually running due to scheduler contention).
*/
TRACE_EVENT(sched_stat_wait,
TP_PROTO(struct task_struct *tsk, u64 delay), TP_PROTO(struct task_struct *tsk, u64 delay),
...@@ -379,97 +342,68 @@ TRACE_EVENT(sched_stat_wait, ...@@ -379,97 +342,68 @@ TRACE_EVENT(sched_stat_wait,
(unsigned long long)__entry->delay) (unsigned long long)__entry->delay)
); );
/* /*
* Tracepoint for accounting runtime (time the task is executing * Tracepoint for accounting wait time (time the task is runnable
* on a CPU). * but not actually running due to scheduler contention).
*/ */
TRACE_EVENT(sched_stat_runtime, DEFINE_EVENT(sched_stat_template, sched_stat_wait,
TP_PROTO(struct task_struct *tsk, u64 delay),
TP_PROTO(struct task_struct *tsk, u64 runtime, u64 vruntime), TP_ARGS(tsk, delay));
TP_ARGS(tsk, runtime, vruntime),
TP_STRUCT__entry(
__array( char, comm, TASK_COMM_LEN )
__field( pid_t, pid )
__field( u64, runtime )
__field( u64, vruntime )
),
TP_fast_assign(
memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
__entry->pid = tsk->pid;
__entry->runtime = runtime;
__entry->vruntime = vruntime;
)
TP_perf_assign(
__perf_count(runtime);
),
TP_printk("comm=%s pid=%d runtime=%Lu [ns] vruntime=%Lu [ns]",
__entry->comm, __entry->pid,
(unsigned long long)__entry->runtime,
(unsigned long long)__entry->vruntime)
);
/* /*
* Tracepoint for accounting sleep time (time the task is not runnable, * Tracepoint for accounting sleep time (time the task is not runnable,
* including iowait, see below). * including iowait, see below).
*/ */
TRACE_EVENT(sched_stat_sleep, DEFINE_EVENT_PRINT(sched_stat_template, sched_stat_sleep,
TP_PROTO(struct task_struct *tsk, u64 delay), TP_PROTO(struct task_struct *tsk, u64 delay),
TP_ARGS(tsk, delay), TP_ARGS(tsk, delay),
TP_printk("task: %s:%d sleep: %Lu [ns]",
TP_STRUCT__entry(
__array( char, comm, TASK_COMM_LEN )
__field( pid_t, pid )
__field( u64, delay )
),
TP_fast_assign(
memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
__entry->pid = tsk->pid;
__entry->delay = delay;
)
TP_perf_assign(
__perf_count(delay);
),
TP_printk("comm=%s pid=%d delay=%Lu [ns]",
__entry->comm, __entry->pid, __entry->comm, __entry->pid,
(unsigned long long)__entry->delay) (unsigned long long)__entry->delay));
);
/* /*
* Tracepoint for accounting iowait time (time the task is not runnable * Tracepoint for accounting iowait time (time the task is not runnable
* due to waiting on IO to complete). * due to waiting on IO to complete).
*/ */
TRACE_EVENT(sched_stat_iowait, DEFINE_EVENT_PRINT(sched_stat_template, sched_stat_iowait,
TP_PROTO(struct task_struct *tsk, u64 delay), TP_PROTO(struct task_struct *tsk, u64 delay),
TP_ARGS(tsk, delay), TP_ARGS(tsk, delay),
TP_printk("task: %s:%d iowait: %Lu [ns]",
__entry->comm, __entry->pid,
(unsigned long long)__entry->delay));
/*
* Tracepoint for accounting runtime (time the task is executing
* on a CPU).
*/
TRACE_EVENT(sched_stat_runtime,
TP_PROTO(struct task_struct *tsk, u64 runtime, u64 vruntime),
TP_ARGS(tsk, runtime, vruntime),
TP_STRUCT__entry( TP_STRUCT__entry(
__array( char, comm, TASK_COMM_LEN ) __array( char, comm, TASK_COMM_LEN )
__field( pid_t, pid ) __field( pid_t, pid )
__field( u64, delay ) __field( u64, runtime )
__field( u64, vruntime )
), ),
TP_fast_assign( TP_fast_assign(
memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
__entry->pid = tsk->pid; __entry->pid = tsk->pid;
__entry->delay = delay; __entry->runtime = runtime;
__entry->vruntime = vruntime;
) )
TP_perf_assign( TP_perf_assign(
__perf_count(delay); __perf_count(runtime);
), ),
TP_printk("comm=%s pid=%d delay=%Lu [ns]", TP_printk("comm=%s pid=%d runtime=%Lu [ns] vruntime=%Lu [ns]",
__entry->comm, __entry->pid, __entry->comm, __entry->pid,
(unsigned long long)__entry->delay) (unsigned long long)__entry->runtime,
(unsigned long long)__entry->vruntime)
); );
#endif /* _TRACE_SCHED_H */ #endif /* _TRACE_SCHED_H */
......
...@@ -18,6 +18,26 @@ ...@@ -18,6 +18,26 @@
#include <linux/ftrace_event.h> #include <linux/ftrace_event.h>
/*
* TRACE_EVENT_TEMPLATE can be used to add a generic function
* handlers for events. That is, if all events have the same
* parameters and just have distinct trace points.
* Each tracepoint can be defined with DEFINE_EVENT and that
* will map the TRACE_EVENT_TEMPLATE to the tracepoint.
*
* TRACE_EVENT is a one to one mapping between tracepoint and template.
*/
#undef TRACE_EVENT
#define TRACE_EVENT(name, proto, args, tstruct, assign, print) \
TRACE_EVENT_TEMPLATE(name, \
PARAMS(proto), \
PARAMS(args), \
PARAMS(tstruct), \
PARAMS(assign), \
PARAMS(print)); \
DEFINE_EVENT(name, name, PARAMS(proto), PARAMS(args));
#undef __field #undef __field
#define __field(type, item) type item; #define __field(type, item) type item;
...@@ -36,15 +56,21 @@ ...@@ -36,15 +56,21 @@
#undef TP_STRUCT__entry #undef TP_STRUCT__entry
#define TP_STRUCT__entry(args...) args #define TP_STRUCT__entry(args...) args
#undef TRACE_EVENT #undef TRACE_EVENT_TEMPLATE
#define TRACE_EVENT(name, proto, args, tstruct, assign, print) \ #define TRACE_EVENT_TEMPLATE(name, proto, args, tstruct, assign, print) \
struct ftrace_raw_##name { \ struct ftrace_raw_##name { \
struct trace_entry ent; \ struct trace_entry ent; \
tstruct \ tstruct \
char __data[0]; \ char __data[0]; \
}; \ };
#undef DEFINE_EVENT
#define DEFINE_EVENT(template, name, proto, args) \
static struct ftrace_event_call event_##name static struct ftrace_event_call event_##name
#undef DEFINE_EVENT_PRINT
#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \
DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args))
#undef __cpparg #undef __cpparg
#define __cpparg(arg...) arg #define __cpparg(arg...) arg
...@@ -89,12 +115,19 @@ ...@@ -89,12 +115,19 @@
#undef __string #undef __string
#define __string(item, src) __dynamic_array(char, item, -1) #define __string(item, src) __dynamic_array(char, item, -1)
#undef TRACE_EVENT #undef TRACE_EVENT_TEMPLATE
#define TRACE_EVENT(call, proto, args, tstruct, assign, print) \ #define TRACE_EVENT_TEMPLATE(call, proto, args, tstruct, assign, print) \
struct ftrace_data_offsets_##call { \ struct ftrace_data_offsets_##call { \
tstruct; \ tstruct; \
}; };
#undef DEFINE_EVENT
#define DEFINE_EVENT(template, name, proto, args)
#undef DEFINE_EVENT_PRINT
#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \
DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args))
#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
/* /*
...@@ -170,10 +203,10 @@ ...@@ -170,10 +203,10 @@
#undef TP_perf_assign #undef TP_perf_assign
#define TP_perf_assign(args...) #define TP_perf_assign(args...)
#undef TRACE_EVENT #undef TRACE_EVENT_TEMPLATE
#define TRACE_EVENT(call, proto, args, tstruct, func, print) \ #define TRACE_EVENT_TEMPLATE(call, proto, args, tstruct, func, print) \
static int \ static int \
ftrace_format_##call(struct ftrace_event_call *unused, \ ftrace_format_setup_##call(struct ftrace_event_call *unused, \
struct trace_seq *s) \ struct trace_seq *s) \
{ \ { \
struct ftrace_raw_##call field __attribute__((unused)); \ struct ftrace_raw_##call field __attribute__((unused)); \
...@@ -181,6 +214,39 @@ ftrace_format_##call(struct ftrace_event_call *unused, \ ...@@ -181,6 +214,39 @@ ftrace_format_##call(struct ftrace_event_call *unused, \
\ \
tstruct; \ tstruct; \
\ \
return ret; \
} \
\
static int \
ftrace_format_##call(struct ftrace_event_call *unused, \
struct trace_seq *s) \
{ \
int ret = 0; \
\
ret = ftrace_format_setup_##call(unused, s); \
if (!ret) \
return ret; \
\
ret = trace_seq_printf(s, "\nprint fmt: " print); \
\
return ret; \
}
#undef DEFINE_EVENT
#define DEFINE_EVENT(template, name, proto, args)
#undef DEFINE_EVENT_PRINT
#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \
static int \
ftrace_format_##name(struct ftrace_event_call *unused, \
struct trace_seq *s) \
{ \
int ret = 0; \
\
ret = ftrace_format_setup_##template(unused, s); \
if (!ret) \
return ret; \
\
trace_seq_printf(s, "\nprint fmt: " print); \ trace_seq_printf(s, "\nprint fmt: " print); \
\ \
return ret; \ return ret; \
...@@ -255,15 +321,57 @@ ftrace_format_##call(struct ftrace_event_call *unused, \ ...@@ -255,15 +321,57 @@ ftrace_format_##call(struct ftrace_event_call *unused, \
ftrace_print_symbols_seq(p, value, symbols); \ ftrace_print_symbols_seq(p, value, symbols); \
}) })
#undef TRACE_EVENT #undef TRACE_EVENT_TEMPLATE
#define TRACE_EVENT(call, proto, args, tstruct, assign, print) \ #define TRACE_EVENT_TEMPLATE(call, proto, args, tstruct, assign, print) \
static enum print_line_t \ static enum print_line_t \
ftrace_raw_output_##call(struct trace_iterator *iter, int flags) \ ftrace_raw_output_id_##call(int event_id, const char *name, \
struct trace_iterator *iter, int flags) \
{ \ { \
struct trace_seq *s = &iter->seq; \ struct trace_seq *s = &iter->seq; \
struct ftrace_raw_##call *field; \ struct ftrace_raw_##call *field; \
struct trace_entry *entry; \ struct trace_entry *entry; \
struct trace_seq *p; \ struct trace_seq *p; \
int ret; \
\
entry = iter->ent; \
\
if (entry->type != event_id) { \
WARN_ON_ONCE(1); \
return TRACE_TYPE_UNHANDLED; \
} \
\
field = (typeof(field))entry; \
\
p = &get_cpu_var(ftrace_event_seq); \
trace_seq_init(p); \
ret = trace_seq_printf(s, "%s: ", name); \
if (ret) \
ret = trace_seq_printf(s, print); \
put_cpu(); \
if (!ret) \
return TRACE_TYPE_PARTIAL_LINE; \
\
return TRACE_TYPE_HANDLED; \
}
#undef DEFINE_EVENT
#define DEFINE_EVENT(template, name, proto, args) \
static enum print_line_t \
ftrace_raw_output_##name(struct trace_iterator *iter, int flags) \
{ \
return ftrace_raw_output_id_##template(event_##name.id, \
#name, iter, flags); \
}
#undef DEFINE_EVENT_PRINT
#define DEFINE_EVENT_PRINT(template, call, proto, args, print) \
static enum print_line_t \
ftrace_raw_output_##call(struct trace_iterator *iter, int flags) \
{ \
struct trace_seq *s = &iter->seq; \
struct ftrace_raw_##template *field; \
struct trace_entry *entry; \
struct trace_seq *p; \
int ret; \ int ret; \
\ \
entry = iter->ent; \ entry = iter->ent; \
...@@ -277,7 +385,9 @@ ftrace_raw_output_##call(struct trace_iterator *iter, int flags) \ ...@@ -277,7 +385,9 @@ ftrace_raw_output_##call(struct trace_iterator *iter, int flags) \
\ \
p = &get_cpu_var(ftrace_event_seq); \ p = &get_cpu_var(ftrace_event_seq); \
trace_seq_init(p); \ trace_seq_init(p); \
ret = trace_seq_printf(s, #call ": " print); \ ret = trace_seq_printf(s, "%s: ", #call); \
if (ret) \
ret = trace_seq_printf(s, print); \
put_cpu(); \ put_cpu(); \
if (!ret) \ if (!ret) \
return TRACE_TYPE_PARTIAL_LINE; \ return TRACE_TYPE_PARTIAL_LINE; \
...@@ -318,8 +428,8 @@ ftrace_raw_output_##call(struct trace_iterator *iter, int flags) \ ...@@ -318,8 +428,8 @@ ftrace_raw_output_##call(struct trace_iterator *iter, int flags) \
#undef __string #undef __string
#define __string(item, src) __dynamic_array(char, item, -1) #define __string(item, src) __dynamic_array(char, item, -1)
#undef TRACE_EVENT #undef TRACE_EVENT_TEMPLATE
#define TRACE_EVENT(call, proto, args, tstruct, func, print) \ #define TRACE_EVENT_TEMPLATE(call, proto, args, tstruct, func, print) \
static int \ static int \
ftrace_define_fields_##call(struct ftrace_event_call *event_call) \ ftrace_define_fields_##call(struct ftrace_event_call *event_call) \
{ \ { \
...@@ -335,6 +445,13 @@ ftrace_define_fields_##call(struct ftrace_event_call *event_call) \ ...@@ -335,6 +445,13 @@ ftrace_define_fields_##call(struct ftrace_event_call *event_call) \
return ret; \ return ret; \
} }
#undef DEFINE_EVENT
#define DEFINE_EVENT(template, name, proto, args)
#undef DEFINE_EVENT_PRINT
#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \
DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args))
#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
/* /*
...@@ -361,10 +478,10 @@ ftrace_define_fields_##call(struct ftrace_event_call *event_call) \ ...@@ -361,10 +478,10 @@ ftrace_define_fields_##call(struct ftrace_event_call *event_call) \
__data_size += (len) * sizeof(type); __data_size += (len) * sizeof(type);
#undef __string #undef __string
#define __string(item, src) __dynamic_array(char, item, strlen(src) + 1) \ #define __string(item, src) __dynamic_array(char, item, strlen(src) + 1)
#undef TRACE_EVENT #undef TRACE_EVENT_TEMPLATE
#define TRACE_EVENT(call, proto, args, tstruct, assign, print) \ #define TRACE_EVENT_TEMPLATE(call, proto, args, tstruct, assign, print) \
static inline int ftrace_get_offsets_##call( \ static inline int ftrace_get_offsets_##call( \
struct ftrace_data_offsets_##call *__data_offsets, proto) \ struct ftrace_data_offsets_##call *__data_offsets, proto) \
{ \ { \
...@@ -376,6 +493,13 @@ static inline int ftrace_get_offsets_##call( \ ...@@ -376,6 +493,13 @@ static inline int ftrace_get_offsets_##call( \
return __data_size; \ return __data_size; \
} }
#undef DEFINE_EVENT
#define DEFINE_EVENT(template, name, proto, args)
#undef DEFINE_EVENT_PRINT
#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \
DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args))
#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
#ifdef CONFIG_EVENT_PROFILE #ifdef CONFIG_EVENT_PROFILE
...@@ -397,21 +521,28 @@ static inline int ftrace_get_offsets_##call( \ ...@@ -397,21 +521,28 @@ static inline int ftrace_get_offsets_##call( \
* *
*/ */
#undef TRACE_EVENT #undef TRACE_EVENT_TEMPLATE
#define TRACE_EVENT(call, proto, args, tstruct, assign, print) \ #define TRACE_EVENT_TEMPLATE(call, proto, args, tstruct, assign, print)
#undef DEFINE_EVENT
#define DEFINE_EVENT(template, name, proto, args) \
\ \
static void ftrace_profile_##call(proto); \ static void ftrace_profile_##name(proto); \
\ \
static int ftrace_profile_enable_##call(struct ftrace_event_call *unused)\ static int ftrace_profile_enable_##name(struct ftrace_event_call *unused)\
{ \ { \
return register_trace_##call(ftrace_profile_##call); \ return register_trace_##name(ftrace_profile_##name); \
} \ } \
\ \
static void ftrace_profile_disable_##call(struct ftrace_event_call *unused)\ static void ftrace_profile_disable_##name(struct ftrace_event_call *unused)\
{ \ { \
unregister_trace_##call(ftrace_profile_##call); \ unregister_trace_##name(ftrace_profile_##name); \
} }
#undef DEFINE_EVENT_PRINT
#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \
DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args))
#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
#endif #endif
...@@ -550,15 +681,13 @@ static void ftrace_profile_disable_##call(struct ftrace_event_call *unused)\ ...@@ -550,15 +681,13 @@ static void ftrace_profile_disable_##call(struct ftrace_event_call *unused)\
#define __assign_str(dst, src) \ #define __assign_str(dst, src) \
strcpy(__get_str(dst), src); strcpy(__get_str(dst), src);
#undef TRACE_EVENT #undef TRACE_EVENT_TEMPLATE
#define TRACE_EVENT(call, proto, args, tstruct, assign, print) \ #define TRACE_EVENT_TEMPLATE(call, proto, args, tstruct, assign, print) \
\
static struct ftrace_event_call event_##call; \
\ \
static void ftrace_raw_event_##call(proto) \ static void ftrace_raw_event_id_##call(struct ftrace_event_call *event_call, \
proto) \
{ \ { \
struct ftrace_data_offsets_##call __maybe_unused __data_offsets;\ struct ftrace_data_offsets_##call __maybe_unused __data_offsets;\
struct ftrace_event_call *event_call = &event_##call; \
struct ring_buffer_event *event; \ struct ring_buffer_event *event; \
struct ftrace_raw_##call *entry; \ struct ftrace_raw_##call *entry; \
struct ring_buffer *buffer; \ struct ring_buffer *buffer; \
...@@ -572,7 +701,7 @@ static void ftrace_raw_event_##call(proto) \ ...@@ -572,7 +701,7 @@ static void ftrace_raw_event_##call(proto) \
__data_size = ftrace_get_offsets_##call(&__data_offsets, args); \ __data_size = ftrace_get_offsets_##call(&__data_offsets, args); \
\ \
event = trace_current_buffer_lock_reserve(&buffer, \ event = trace_current_buffer_lock_reserve(&buffer, \
event_##call.id, \ event_call->id, \
sizeof(*entry) + __data_size, \ sizeof(*entry) + __data_size, \
irq_flags, pc); \ irq_flags, pc); \
if (!event) \ if (!event) \
...@@ -587,6 +716,14 @@ static void ftrace_raw_event_##call(proto) \ ...@@ -587,6 +716,14 @@ static void ftrace_raw_event_##call(proto) \
if (!filter_current_check_discard(buffer, event_call, entry, event)) \ if (!filter_current_check_discard(buffer, event_call, entry, event)) \
trace_nowake_buffer_unlock_commit(buffer, \ trace_nowake_buffer_unlock_commit(buffer, \
event, irq_flags, pc); \ event, irq_flags, pc); \
}
#undef DEFINE_EVENT
#define DEFINE_EVENT(template, call, proto, args) \
\
static void ftrace_raw_event_##call(proto) \
{ \
ftrace_raw_event_id_##template(&event_##call, args); \
} \ } \
\ \
static int ftrace_raw_reg_event_##call(struct ftrace_event_call *unused)\ static int ftrace_raw_reg_event_##call(struct ftrace_event_call *unused)\
...@@ -619,7 +756,36 @@ static int ftrace_raw_init_event_##call(struct ftrace_event_call *unused)\ ...@@ -619,7 +756,36 @@ static int ftrace_raw_init_event_##call(struct ftrace_event_call *unused)\
event_##call.id = id; \ event_##call.id = id; \
INIT_LIST_HEAD(&event_##call.fields); \ INIT_LIST_HEAD(&event_##call.fields); \
return 0; \ return 0; \
} \ }
#undef DEFINE_EVENT_PRINT
#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \
DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args))
#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
#undef TRACE_EVENT_TEMPLATE
#define TRACE_EVENT_TEMPLATE(call, proto, args, tstruct, assign, print)
#undef DEFINE_EVENT
#define DEFINE_EVENT(template, call, proto, args) \
\
static struct ftrace_event_call __used \
__attribute__((__aligned__(4))) \
__attribute__((section("_ftrace_events"))) event_##call = { \
.name = #call, \
.system = __stringify(TRACE_SYSTEM), \
.event = &ftrace_event_type_##call, \
.raw_init = ftrace_raw_init_event_##call, \
.regfunc = ftrace_raw_reg_event_##call, \
.unregfunc = ftrace_raw_unreg_event_##call, \
.show_format = ftrace_format_##template, \
.define_fields = ftrace_define_fields_##template, \
_TRACE_PROFILE_INIT(call) \
}
#undef DEFINE_EVENT_PRINT
#define DEFINE_EVENT_PRINT(template, call, proto, args, print) \
\ \
static struct ftrace_event_call __used \ static struct ftrace_event_call __used \
__attribute__((__aligned__(4))) \ __attribute__((__aligned__(4))) \
...@@ -631,7 +797,7 @@ __attribute__((section("_ftrace_events"))) event_##call = { \ ...@@ -631,7 +797,7 @@ __attribute__((section("_ftrace_events"))) event_##call = { \
.regfunc = ftrace_raw_reg_event_##call, \ .regfunc = ftrace_raw_reg_event_##call, \
.unregfunc = ftrace_raw_unreg_event_##call, \ .unregfunc = ftrace_raw_unreg_event_##call, \
.show_format = ftrace_format_##call, \ .show_format = ftrace_format_##call, \
.define_fields = ftrace_define_fields_##call, \ .define_fields = ftrace_define_fields_##template, \
_TRACE_PROFILE_INIT(call) \ _TRACE_PROFILE_INIT(call) \
} }
...@@ -719,14 +885,15 @@ __attribute__((section("_ftrace_events"))) event_##call = { \ ...@@ -719,14 +885,15 @@ __attribute__((section("_ftrace_events"))) event_##call = { \
#undef __perf_count #undef __perf_count
#define __perf_count(c) __count = (c) #define __perf_count(c) __count = (c)
#undef TRACE_EVENT #undef TRACE_EVENT_TEMPLATE
#define TRACE_EVENT(call, proto, args, tstruct, assign, print) \ #define TRACE_EVENT_TEMPLATE(call, proto, args, tstruct, assign, print) \
static void ftrace_profile_##call(proto) \ static void \
ftrace_profile_templ_##call(struct ftrace_event_call *event_call, \
proto) \
{ \ { \
struct ftrace_data_offsets_##call __maybe_unused __data_offsets;\ struct ftrace_data_offsets_##call __maybe_unused __data_offsets;\
extern int perf_swevent_get_recursion_context(void); \ extern int perf_swevent_get_recursion_context(void); \
extern void perf_swevent_put_recursion_context(int rctx); \ extern void perf_swevent_put_recursion_context(int rctx); \
struct ftrace_event_call *event_call = &event_##call; \
extern void perf_tp_event(int, u64, u64, void *, int); \ extern void perf_tp_event(int, u64, u64, void *, int); \
struct ftrace_raw_##call *entry; \ struct ftrace_raw_##call *entry; \
u64 __addr = 0, __count = 1; \ u64 __addr = 0, __count = 1; \
...@@ -789,6 +956,19 @@ end_recursion: \ ...@@ -789,6 +956,19 @@ end_recursion: \
\ \
} }
#undef DEFINE_EVENT
#define DEFINE_EVENT(template, call, proto, args) \
static void ftrace_profile_##call(proto) \
{ \
struct ftrace_event_call *event_call = &event_##call; \
\
ftrace_profile_templ_##template(event_call, args); \
}
#undef DEFINE_EVENT_PRINT
#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \
DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args))
#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
#endif /* CONFIG_EVENT_PROFILE */ #endif /* CONFIG_EVENT_PROFILE */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment