mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-07 07:08:07 +00:00
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.
|
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
|
Usage examples
|
||||||
--------------
|
--------------
|
||||||
To add a probe as a new event, write a new definition to kprobe_events
|
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 kprobe kp;
|
||||||
struct kretprobe rp;
|
struct kretprobe rp;
|
||||||
};
|
};
|
||||||
|
unsigned long nhit;
|
||||||
const char *symbol; /* symbol name */
|
const char *symbol; /* symbol name */
|
||||||
struct ftrace_event_call call;
|
struct ftrace_event_call call;
|
||||||
struct trace_event event;
|
struct trace_event event;
|
||||||
|
@ -781,6 +782,37 @@ static const struct file_operations kprobe_events_ops = {
|
||||||
.write = probes_write,
|
.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 */
|
/* Kprobe handler */
|
||||||
static __kprobes int kprobe_trace_func(struct kprobe *kp, struct pt_regs *regs)
|
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;
|
unsigned long irq_flags;
|
||||||
struct ftrace_event_call *call = &tp->call;
|
struct ftrace_event_call *call = &tp->call;
|
||||||
|
|
||||||
|
tp->nhit++;
|
||||||
|
|
||||||
local_save_flags(irq_flags);
|
local_save_flags(irq_flags);
|
||||||
pc = preempt_count();
|
pc = preempt_count();
|
||||||
|
|
||||||
|
@ -1140,9 +1174,18 @@ static __init int init_kprobe_trace(void)
|
||||||
entry = debugfs_create_file("kprobe_events", 0644, d_tracer,
|
entry = debugfs_create_file("kprobe_events", 0644, d_tracer,
|
||||||
NULL, &kprobe_events_ops);
|
NULL, &kprobe_events_ops);
|
||||||
|
|
||||||
|
/* Event list interface */
|
||||||
if (!entry)
|
if (!entry)
|
||||||
pr_warning("Could not create debugfs "
|
pr_warning("Could not create debugfs "
|
||||||
"'kprobe_events' entry\n");
|
"'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;
|
return 0;
|
||||||
}
|
}
|
||||||
fs_initcall(init_kprobe_trace);
|
fs_initcall(init_kprobe_trace);
|
||||||
|
|
Loading…
Add table
Reference in a new issue