From patchwork Thu Jul 16 15:57:59 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Masami Hiramatsu X-Patchwork-Id: 35914 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n6GFwHta017616 for ; Thu, 16 Jul 2009 15:58:20 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932659AbZGPPzi (ORCPT ); Thu, 16 Jul 2009 11:55:38 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S932657AbZGPPze (ORCPT ); Thu, 16 Jul 2009 11:55:34 -0400 Received: from mx2.redhat.com ([66.187.237.31]:58236 "EHLO mx2.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932621AbZGPPz0 (ORCPT ); Thu, 16 Jul 2009 11:55:26 -0400 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n6GFsrqx025557; Thu, 16 Jul 2009 11:54:53 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n6GFsqsv001648; Thu, 16 Jul 2009 11:54:52 -0400 Received: from localhost.localdomain (dhcp-100-3-156.bos.redhat.com [10.16.3.156]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n6GFsofd025996; Thu, 16 Jul 2009 11:54:50 -0400 From: Masami Hiramatsu Subject: [PATCH -tip -v12 11/11] tracing: Add kprobes event profiling interface To: Ingo Molnar , Steven Rostedt , lkml Cc: systemtap , kvm , DLE , Masami Hiramatsu , Ananth N Mavinakayanahalli , Christoph Hellwig , Steven Rostedt , Ingo Molnar , Frederic Weisbecker , Tom Zanussi , Li Zefan Date: Thu, 16 Jul 2009 11:57:59 -0400 Message-ID: <20090716155759.6266.74017.stgit@localhost.localdomain> In-Reply-To: <20090716155652.6266.39970.stgit@localhost.localdomain> References: <20090716155652.6266.39970.stgit@localhost.localdomain> User-Agent: StGIT/0.14.3 MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Add profiling interaces for each kprobes event. Changes from v11: - Fix a typo and remove redundant check. Signed-off-by: Masami Hiramatsu Cc: Ananth N Mavinakayanahalli Cc: Christoph Hellwig Cc: Steven Rostedt Cc: Ingo Molnar Cc: Frederic Weisbecker Cc: Tom Zanussi Cc: Li Zefan --- Documentation/trace/kprobetrace.txt | 8 ++++++ kernel/trace/trace_kprobe.c | 45 +++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 0 deletions(-) diff --git a/Documentation/trace/kprobetrace.txt b/Documentation/trace/kprobetrace.txt index 437ad49..9c6be05 100644 --- a/Documentation/trace/kprobetrace.txt +++ b/Documentation/trace/kprobetrace.txt @@ -69,6 +69,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 diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c index 3444d1d..21e619f 100644 --- a/kernel/trace/trace_kprobe.c +++ b/kernel/trace/trace_kprobe.c @@ -178,6 +178,7 @@ struct trace_probe { struct kprobe kp; struct kretprobe rp; }; + unsigned long nhits; const char *symbol; /* symbol name */ struct ftrace_event_call call; unsigned int nr_args; @@ -766,6 +767,39 @@ static const struct file_operations kprobe_events_ops = { .write = probes_write, }; +/* Probes profiling interfaces */ +static int profile_seq_show(struct seq_file *m, void *v) +{ + struct trace_probe *tp = v; + + seq_printf(m, "%s", tp->call.name); + + seq_printf(m, "\t%8lu %8lu\n", tp->nhits, + 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 = 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) { @@ -776,6 +810,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->nhits++; + local_save_flags(irq_flags); pc = preempt_count(); @@ -1152,9 +1188,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);