tracing/kprobes: Merge trace probe enable/disable functions

Merge redundant enable/disable functions into enable_trace_probe()
and disable_trace_probe().

Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: yrl.pp-manager.tt@hitachi.com
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@redhat.com>
Link: http://lkml.kernel.org/r/20110627072644.6528.26910.stgit@fedora15

[ converted kprobe selftest to use  enable_trace_probe ]

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
Masami Hiramatsu 2011-06-27 16:26:44 +09:00 коммит произвёл Steven Rostedt
Родитель 7143f168e2
Коммит 1538f888f1
1 изменённых файлов: 36 добавлений и 56 удалений

Просмотреть файл

@ -683,6 +683,34 @@ static struct trace_probe *find_trace_probe(const char *event,
return NULL; return NULL;
} }
/* Enable trace_probe - @flag must be TP_FLAG_TRACE or TP_FLAG_PROFILE */
static int enable_trace_probe(struct trace_probe *tp, int flag)
{
int ret = 0;
tp->flags |= flag;
if (tp->flags & (TP_FLAG_TRACE | TP_FLAG_PROFILE)) {
if (trace_probe_is_return(tp))
ret = enable_kretprobe(&tp->rp);
else
ret = enable_kprobe(&tp->rp.kp);
}
return ret;
}
/* Disable trace_probe - @flag must be TP_FLAG_TRACE or TP_FLAG_PROFILE */
static void disable_trace_probe(struct trace_probe *tp, int flag)
{
tp->flags &= ~flag;
if (!(tp->flags & (TP_FLAG_TRACE | TP_FLAG_PROFILE))) {
if (trace_probe_is_return(tp))
disable_kretprobe(&tp->rp);
else
disable_kprobe(&tp->rp.kp);
}
}
/* Unregister a trace_probe and probe_event: call with locking probe_lock */ /* Unregister a trace_probe and probe_event: call with locking probe_lock */
static void unregister_trace_probe(struct trace_probe *tp) static void unregister_trace_probe(struct trace_probe *tp)
{ {
@ -1514,30 +1542,6 @@ partial:
return TRACE_TYPE_PARTIAL_LINE; return TRACE_TYPE_PARTIAL_LINE;
} }
static int probe_event_enable(struct ftrace_event_call *call)
{
struct trace_probe *tp = (struct trace_probe *)call->data;
tp->flags |= TP_FLAG_TRACE;
if (trace_probe_is_return(tp))
return enable_kretprobe(&tp->rp);
else
return enable_kprobe(&tp->rp.kp);
}
static void probe_event_disable(struct ftrace_event_call *call)
{
struct trace_probe *tp = (struct trace_probe *)call->data;
tp->flags &= ~TP_FLAG_TRACE;
if (!(tp->flags & (TP_FLAG_TRACE | TP_FLAG_PROFILE))) {
if (trace_probe_is_return(tp))
disable_kretprobe(&tp->rp);
else
disable_kprobe(&tp->rp.kp);
}
}
#undef DEFINE_FIELD #undef DEFINE_FIELD
#define DEFINE_FIELD(type, item, name, is_signed) \ #define DEFINE_FIELD(type, item, name, is_signed) \
do { \ do { \
@ -1716,49 +1720,25 @@ static __kprobes void kretprobe_perf_func(struct kretprobe_instance *ri,
head = this_cpu_ptr(call->perf_events); head = this_cpu_ptr(call->perf_events);
perf_trace_buf_submit(entry, size, rctx, entry->ret_ip, 1, regs, head); perf_trace_buf_submit(entry, size, rctx, entry->ret_ip, 1, regs, head);
} }
static int probe_perf_enable(struct ftrace_event_call *call)
{
struct trace_probe *tp = (struct trace_probe *)call->data;
tp->flags |= TP_FLAG_PROFILE;
if (trace_probe_is_return(tp))
return enable_kretprobe(&tp->rp);
else
return enable_kprobe(&tp->rp.kp);
}
static void probe_perf_disable(struct ftrace_event_call *call)
{
struct trace_probe *tp = (struct trace_probe *)call->data;
tp->flags &= ~TP_FLAG_PROFILE;
if (!(tp->flags & TP_FLAG_TRACE)) {
if (trace_probe_is_return(tp))
disable_kretprobe(&tp->rp);
else
disable_kprobe(&tp->rp.kp);
}
}
#endif /* CONFIG_PERF_EVENTS */ #endif /* CONFIG_PERF_EVENTS */
static __kprobes static __kprobes
int kprobe_register(struct ftrace_event_call *event, enum trace_reg type) int kprobe_register(struct ftrace_event_call *event, enum trace_reg type)
{ {
struct trace_probe *tp = (struct trace_probe *)event->data;
switch (type) { switch (type) {
case TRACE_REG_REGISTER: case TRACE_REG_REGISTER:
return probe_event_enable(event); return enable_trace_probe(tp, TP_FLAG_TRACE);
case TRACE_REG_UNREGISTER: case TRACE_REG_UNREGISTER:
probe_event_disable(event); disable_trace_probe(tp, TP_FLAG_TRACE);
return 0; return 0;
#ifdef CONFIG_PERF_EVENTS #ifdef CONFIG_PERF_EVENTS
case TRACE_REG_PERF_REGISTER: case TRACE_REG_PERF_REGISTER:
return probe_perf_enable(event); return enable_trace_probe(tp, TP_FLAG_PROFILE);
case TRACE_REG_PERF_UNREGISTER: case TRACE_REG_PERF_UNREGISTER:
probe_perf_disable(event); disable_trace_probe(tp, TP_FLAG_PROFILE);
return 0; return 0;
#endif #endif
} }
@ -1905,7 +1885,7 @@ static __init int kprobe_trace_self_tests_init(void)
pr_warning("error on getting new probe.\n"); pr_warning("error on getting new probe.\n");
warn++; warn++;
} else } else
probe_event_enable(&tp->call); enable_trace_probe(tp, TP_FLAG_TRACE);
} }
ret = command_trace_probe("r:testprobe2 kprobe_trace_selftest_target " ret = command_trace_probe("r:testprobe2 kprobe_trace_selftest_target "
@ -1920,7 +1900,7 @@ static __init int kprobe_trace_self_tests_init(void)
pr_warning("error on getting new probe.\n"); pr_warning("error on getting new probe.\n");
warn++; warn++;
} else } else
probe_event_enable(&tp->call); enable_trace_probe(tp, TP_FLAG_TRACE);
} }
if (warn) if (warn)