Skip to content

Commit

Permalink
tracing: Kprobe tracer assigns new event ids for each event
Browse files Browse the repository at this point in the history
Assign new event ids for each kprobes event. This doesn't clear
ring_buffer when unregistering each kprobe event. Thus, if you mind
'Unknown event' messages, clear the buffer manually after changing
kprobe events.

Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com>
Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
Cc: Avi Kivity <avi@redhat.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Frank Ch. Eigler <fche@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Jason Baron <jbaron@redhat.com>
Cc: Jim Keniston <jkenisto@us.ibm.com>
Cc: K.Prasad <prasad@linux.vnet.ibm.com>
Cc: Lai Jiangshan <laijs@cn.fujitsu.com>
Cc: Li Zefan <lizf@cn.fujitsu.com>
Cc: Przemysław Pawełczyk <przemyslaw@pawelczyk.it>
Cc: Roland McGrath <roland@redhat.com>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Tom Zanussi <tzanussi@gmail.com>
Cc: Vegard Nossum <vegard.nossum@gmail.com>
LKML-Reference: <20090813203534.31965.49105.stgit@localhost.localdomain>
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
  • Loading branch information
Masami Hiramatsu authored and Frederic Weisbecker committed Aug 27, 2009
1 parent 4263565 commit ff50d99
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 42 deletions.
6 changes: 0 additions & 6 deletions kernel/trace/trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,6 @@ enum trace_type {
TRACE_KMEM_FREE,
TRACE_POWER,
TRACE_BLK,
TRACE_KPROBE,
TRACE_KRETPROBE,

__TRACE_LAST_TYPE,
};
Expand Down Expand Up @@ -343,10 +341,6 @@ extern void __ftrace_bad_type(void);
TRACE_KMEM_ALLOC); \
IF_ASSIGN(var, ent, struct kmemtrace_free_entry, \
TRACE_KMEM_FREE); \
IF_ASSIGN(var, ent, struct kprobe_trace_entry, \
TRACE_KPROBE); \
IF_ASSIGN(var, ent, struct kretprobe_trace_entry, \
TRACE_KRETPROBE); \
__ftrace_bad_type(); \
} while (0)

Expand Down
51 changes: 15 additions & 36 deletions kernel/trace/trace_kprobe.c
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ struct trace_probe {
};
const char *symbol; /* symbol name */
struct ftrace_event_call call;
struct trace_event event;
unsigned int nr_args;
struct fetch_func args[];
};
Expand Down Expand Up @@ -795,7 +796,7 @@ static __kprobes int kprobe_trace_func(struct kprobe *kp, struct pt_regs *regs)

size = SIZEOF_KPROBE_TRACE_ENTRY(tp->nr_args);

event = trace_current_buffer_lock_reserve(TRACE_KPROBE, size,
event = trace_current_buffer_lock_reserve(call->id, size,
irq_flags, pc);
if (!event)
return 0;
Expand Down Expand Up @@ -827,7 +828,7 @@ static __kprobes int kretprobe_trace_func(struct kretprobe_instance *ri,

size = SIZEOF_KRETPROBE_TRACE_ENTRY(tp->nr_args);

event = trace_current_buffer_lock_reserve(TRACE_KRETPROBE, size,
event = trace_current_buffer_lock_reserve(call->id, size,
irq_flags, pc);
if (!event)
return 0;
Expand All @@ -853,7 +854,7 @@ print_kprobe_event(struct trace_iterator *iter, int flags)
struct trace_seq *s = &iter->seq;
int i;

trace_assign_type(field, iter->ent);
field = (struct kprobe_trace_entry *)iter->ent;

if (!seq_print_ip_sym(s, field->ip, flags | TRACE_ITER_SYM_OFFSET))
goto partial;
Expand All @@ -880,7 +881,7 @@ print_kretprobe_event(struct trace_iterator *iter, int flags)
struct trace_seq *s = &iter->seq;
int i;

trace_assign_type(field, iter->ent);
field = (struct kretprobe_trace_entry *)iter->ent;

if (!seq_print_ip_sym(s, field->ret_ip, flags | TRACE_ITER_SYM_OFFSET))
goto partial;
Expand All @@ -906,16 +907,6 @@ print_kretprobe_event(struct trace_iterator *iter, int flags)
return TRACE_TYPE_PARTIAL_LINE;
}

static struct trace_event kprobe_trace_event = {
.type = TRACE_KPROBE,
.trace = print_kprobe_event,
};

static struct trace_event kretprobe_trace_event = {
.type = TRACE_KRETPROBE,
.trace = print_kretprobe_event,
};

static int probe_event_enable(struct ftrace_event_call *call)
{
struct trace_probe *tp = (struct trace_probe *)call->data;
Expand Down Expand Up @@ -1104,35 +1095,35 @@ static int register_probe_event(struct trace_probe *tp)
/* Initialize ftrace_event_call */
call->system = "kprobes";
if (probe_is_return(tp)) {
call->event = &kretprobe_trace_event;
call->id = TRACE_KRETPROBE;
tp->event.trace = print_kretprobe_event;
call->raw_init = probe_event_raw_init;
call->show_format = kretprobe_event_show_format;
call->define_fields = kretprobe_event_define_fields;
} else {
call->event = &kprobe_trace_event;
call->id = TRACE_KPROBE;
tp->event.trace = print_kprobe_event;
call->raw_init = probe_event_raw_init;
call->show_format = kprobe_event_show_format;
call->define_fields = kprobe_event_define_fields;
}
call->event = &tp->event;
call->id = register_ftrace_event(&tp->event);
if (!call->id)
return -ENODEV;
call->enabled = 1;
call->regfunc = probe_event_enable;
call->unregfunc = probe_event_disable;
call->data = tp;
ret = trace_add_event_call(call);
if (ret)
if (ret) {
pr_info("Failed to register kprobe event: %s\n", call->name);
unregister_ftrace_event(&tp->event);
}
return ret;
}

static void unregister_probe_event(struct trace_probe *tp)
{
/*
* Prevent to unregister event itself because the event is shared
* among other probes.
*/
tp->call.event = NULL;
/* tp->event is unregistered in trace_remove_event_call() */
trace_remove_event_call(&tp->call);
}

Expand All @@ -1141,18 +1132,6 @@ static __init int init_kprobe_trace(void)
{
struct dentry *d_tracer;
struct dentry *entry;
int ret;

ret = register_ftrace_event(&kprobe_trace_event);
if (!ret) {
pr_warning("Could not register kprobe_trace_event type.\n");
return 0;
}
ret = register_ftrace_event(&kretprobe_trace_event);
if (!ret) {
pr_warning("Could not register kretprobe_trace_event type.\n");
return 0;
}

d_tracer = tracing_init_dentry();
if (!d_tracer)
Expand Down

0 comments on commit ff50d99

Please sign in to comment.