Commit e5e25cf4 authored by Frederic Weisbecker's avatar Frederic Weisbecker

tracing: Factorize the events profile accounting

Factorize the events enabling accounting in a common tracing core
helper. This reduces the size of the profile_enable() and
profile_disable() callbacks for each trace events.
Signed-off-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
Acked-by: default avatarSteven Rostedt <rostedt@goodmis.org>
Acked-by: default avatarLi Zefan <lizf@cn.fujitsu.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Jason Baron <jbaron@redhat.com>
Cc: Masami Hiramatsu <mhiramat@redhat.com>
Cc: Ingo Molnar <mingo@elte.hu>
parent 0efb4d20
...@@ -130,8 +130,8 @@ struct ftrace_event_call { ...@@ -130,8 +130,8 @@ struct ftrace_event_call {
void *data; void *data;
atomic_t profile_count; atomic_t profile_count;
int (*profile_enable)(struct ftrace_event_call *); int (*profile_enable)(void);
void (*profile_disable)(struct ftrace_event_call *); void (*profile_disable)(void);
}; };
#define MAX_FILTER_PRED 32 #define MAX_FILTER_PRED 32
......
...@@ -100,32 +100,24 @@ struct perf_counter_attr; ...@@ -100,32 +100,24 @@ struct perf_counter_attr;
#ifdef CONFIG_EVENT_PROFILE #ifdef CONFIG_EVENT_PROFILE
#define TRACE_SYS_ENTER_PROFILE(sname) \ #define TRACE_SYS_ENTER_PROFILE(sname) \
static int prof_sysenter_enable_##sname(struct ftrace_event_call *event_call) \ static int prof_sysenter_enable_##sname(void) \
{ \ { \
int ret = 0; \ return reg_prof_syscall_enter("sys"#sname); \
if (!atomic_inc_return(&event_enter_##sname.profile_count)) \
ret = reg_prof_syscall_enter("sys"#sname); \
return ret; \
} \ } \
\ \
static void prof_sysenter_disable_##sname(struct ftrace_event_call *event_call)\ static void prof_sysenter_disable_##sname(void) \
{ \ { \
if (atomic_add_negative(-1, &event_enter_##sname.profile_count)) \
unreg_prof_syscall_enter("sys"#sname); \ unreg_prof_syscall_enter("sys"#sname); \
} }
#define TRACE_SYS_EXIT_PROFILE(sname) \ #define TRACE_SYS_EXIT_PROFILE(sname) \
static int prof_sysexit_enable_##sname(struct ftrace_event_call *event_call) \ static int prof_sysexit_enable_##sname(void) \
{ \ { \
int ret = 0; \ return reg_prof_syscall_exit("sys"#sname); \
if (!atomic_inc_return(&event_exit_##sname.profile_count)) \
ret = reg_prof_syscall_exit("sys"#sname); \
return ret; \
} \ } \
\ \
static void prof_sysexit_disable_##sname(struct ftrace_event_call *event_call) \ static void prof_sysexit_disable_##sname(void) \
{ \ { \
if (atomic_add_negative(-1, &event_exit_##sname.profile_count)) \
unreg_prof_syscall_exit("sys"#sname); \ unreg_prof_syscall_exit("sys"#sname); \
} }
......
...@@ -382,19 +382,13 @@ static inline int ftrace_get_offsets_##call( \ ...@@ -382,19 +382,13 @@ static inline int ftrace_get_offsets_##call( \
* *
* NOTE: The insertion profile callback (ftrace_profile_<call>) is defined later * NOTE: The insertion profile callback (ftrace_profile_<call>) is defined later
* *
* static int ftrace_profile_enable_<call>(struct ftrace_event_call *event_call) * static int ftrace_profile_enable_<call>(void)
* { * {
* int ret = 0; * return register_trace_<call>(ftrace_profile_<call>);
*
* if (!atomic_inc_return(&event_call->profile_count))
* ret = register_trace_<call>(ftrace_profile_<call>);
*
* return ret;
* } * }
* *
* static void ftrace_profile_disable_<call>(struct ftrace_event_call *event_call) * static void ftrace_profile_disable_<call>(void)
* { * {
* if (atomic_add_negative(-1, &event->call->profile_count))
* unregister_trace_<call>(ftrace_profile_<call>); * unregister_trace_<call>(ftrace_profile_<call>);
* } * }
* *
...@@ -405,19 +399,13 @@ static inline int ftrace_get_offsets_##call( \ ...@@ -405,19 +399,13 @@ static inline int ftrace_get_offsets_##call( \
\ \
static void ftrace_profile_##call(proto); \ static void ftrace_profile_##call(proto); \
\ \
static int ftrace_profile_enable_##call(struct ftrace_event_call *event_call) \ static int ftrace_profile_enable_##call(void) \
{ \ { \
int ret = 0; \ return register_trace_##call(ftrace_profile_##call); \
\
if (!atomic_inc_return(&event_call->profile_count)) \
ret = register_trace_##call(ftrace_profile_##call); \
\
return ret; \
} \ } \
\ \
static void ftrace_profile_disable_##call(struct ftrace_event_call *event_call)\ static void ftrace_profile_disable_##call(void) \
{ \ { \
if (atomic_add_negative(-1, &event_call->profile_count)) \
unregister_trace_##call(ftrace_profile_##call); \ unregister_trace_##call(ftrace_profile_##call); \
} }
......
...@@ -8,6 +8,14 @@ ...@@ -8,6 +8,14 @@
#include <linux/module.h> #include <linux/module.h>
#include "trace.h" #include "trace.h"
static int ftrace_profile_enable_event(struct ftrace_event_call *event)
{
if (atomic_inc_return(&event->profile_count))
return 0;
return event->profile_enable();
}
int ftrace_profile_enable(int event_id) int ftrace_profile_enable(int event_id)
{ {
struct ftrace_event_call *event; struct ftrace_event_call *event;
...@@ -17,7 +25,7 @@ int ftrace_profile_enable(int event_id) ...@@ -17,7 +25,7 @@ int ftrace_profile_enable(int event_id)
list_for_each_entry(event, &ftrace_events, list) { list_for_each_entry(event, &ftrace_events, list) {
if (event->id == event_id && event->profile_enable && if (event->id == event_id && event->profile_enable &&
try_module_get(event->mod)) { try_module_get(event->mod)) {
ret = event->profile_enable(event); ret = ftrace_profile_enable_event(event);
break; break;
} }
} }
...@@ -26,6 +34,14 @@ int ftrace_profile_enable(int event_id) ...@@ -26,6 +34,14 @@ int ftrace_profile_enable(int event_id)
return ret; return ret;
} }
static void ftrace_profile_disable_event(struct ftrace_event_call *event)
{
if (!atomic_add_negative(-1, &event->profile_count))
return;
event->profile_disable();
}
void ftrace_profile_disable(int event_id) void ftrace_profile_disable(int event_id)
{ {
struct ftrace_event_call *event; struct ftrace_event_call *event;
...@@ -33,7 +49,7 @@ void ftrace_profile_disable(int event_id) ...@@ -33,7 +49,7 @@ void ftrace_profile_disable(int event_id)
mutex_lock(&event_mutex); mutex_lock(&event_mutex);
list_for_each_entry(event, &ftrace_events, list) { list_for_each_entry(event, &ftrace_events, list) {
if (event->id == event_id) { if (event->id == event_id) {
event->profile_disable(event); ftrace_profile_disable_event(event);
module_put(event->mod); module_put(event->mod);
break; break;
} }
......
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