tracing: Add kprobes event profiling interface
Add profiling interfaces for each kprobes event. This interface provides how many times each probe hit or missed. 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: <20090813203541.31965.8452.stgit@localhost.localdomain> Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
This commit is contained in:
parent
ff50d99136
commit
cd7e7bd5e4
2 changed files with 51 additions and 0 deletions
|
@ -70,6 +70,14 @@ filter:
|
|||
names and field names for describing filters.
|
||||
|
||||
|
||||
Event Profiling
|
||||
---------------
|
||||
You can check the total number of probe hits and probe miss-hits via
|
||||
/sys/kernel/debug/tracing/kprobe_profile.
|
||||
The first column is event name, the second is the number of probe hits,
|
||||
the third is the number of probe miss-hits.
|
||||
|
||||
|
||||
Usage examples
|
||||
--------------
|
||||
To add a probe as a new event, write a new definition to kprobe_events
|
||||
|
|
|
@ -184,6 +184,7 @@ struct trace_probe {
|
|||
struct kprobe kp;
|
||||
struct kretprobe rp;
|
||||
};
|
||||
unsigned long nhit;
|
||||
const char *symbol; /* symbol name */
|
||||
struct ftrace_event_call call;
|
||||
struct trace_event event;
|
||||
|
@ -781,6 +782,37 @@ static const struct file_operations kprobe_events_ops = {
|
|||
.write = probes_write,
|
||||
};
|
||||
|
||||
/* Probes profiling interfaces */
|
||||
static int probes_profile_seq_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct trace_probe *tp = v;
|
||||
|
||||
seq_printf(m, " %-44s %15lu %15lu\n", tp->call.name, tp->nhit,
|
||||
probe_is_return(tp) ? tp->rp.kp.nmissed : tp->kp.nmissed);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct seq_operations profile_seq_op = {
|
||||
.start = probes_seq_start,
|
||||
.next = probes_seq_next,
|
||||
.stop = probes_seq_stop,
|
||||
.show = probes_profile_seq_show
|
||||
};
|
||||
|
||||
static int profile_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return seq_open(file, &profile_seq_op);
|
||||
}
|
||||
|
||||
static const struct file_operations kprobe_profile_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = profile_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release,
|
||||
};
|
||||
|
||||
/* Kprobe handler */
|
||||
static __kprobes int kprobe_trace_func(struct kprobe *kp, struct pt_regs *regs)
|
||||
{
|
||||
|
@ -791,6 +823,8 @@ static __kprobes int kprobe_trace_func(struct kprobe *kp, struct pt_regs *regs)
|
|||
unsigned long irq_flags;
|
||||
struct ftrace_event_call *call = &tp->call;
|
||||
|
||||
tp->nhit++;
|
||||
|
||||
local_save_flags(irq_flags);
|
||||
pc = preempt_count();
|
||||
|
||||
|
@ -1140,9 +1174,18 @@ static __init int init_kprobe_trace(void)
|
|||
entry = debugfs_create_file("kprobe_events", 0644, d_tracer,
|
||||
NULL, &kprobe_events_ops);
|
||||
|
||||
/* Event list interface */
|
||||
if (!entry)
|
||||
pr_warning("Could not create debugfs "
|
||||
"'kprobe_events' entry\n");
|
||||
|
||||
/* Profile interface */
|
||||
entry = debugfs_create_file("kprobe_profile", 0444, d_tracer,
|
||||
NULL, &kprobe_profile_ops);
|
||||
|
||||
if (!entry)
|
||||
pr_warning("Could not create debugfs "
|
||||
"'kprobe_profile' entry\n");
|
||||
return 0;
|
||||
}
|
||||
fs_initcall(init_kprobe_trace);
|
||||
|
|
Loading…
Reference in a new issue