Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752194AbcDZOqC (ORCPT ); Tue, 26 Apr 2016 10:46:02 -0400 Received: from mail.kernel.org ([198.145.29.136]:45969 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751798AbcDZOqA (ORCPT ); Tue, 26 Apr 2016 10:46:00 -0400 Date: Tue, 26 Apr 2016 23:45:55 +0900 From: Masami Hiramatsu To: Ravi Bangoria Cc: linux-kernel@vger.kernel.org, acme@kernel.org, peterz@infradead.org, mingo@redhat.com, alexander.shishkin@linux.intel.com, mhiramat@kernel.org, wangnan0@huawei.com, namhyung@kernel.org, srikar@linux.vnet.ibm.com, naveen.n.rao@linux.vnet.ibm.com Subject: Re: [PATCH 2/2] perf probe: Fix offline module name missmatch issue Message-Id: <20160426234555.67429b674918ae8d35c0a892@kernel.org> In-Reply-To: <1461680741-12517-2-git-send-email-ravi.bangoria@linux.vnet.ibm.com> References: <1461680741-12517-1-git-send-email-ravi.bangoria@linux.vnet.ibm.com> <1461680741-12517-2-git-send-email-ravi.bangoria@linux.vnet.ibm.com> X-Mailer: Sylpheed 3.4.3 (GTK+ 2.24.28; x86_64-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3894 Lines: 134 On Tue, 26 Apr 2016 19:55:41 +0530 Ravi Bangoria wrote: > Perf can add a probe on kernel module which has not been loaded yet. > Current implementation finds module name from path. But if filename > is different from actual module name then perf fails to register > probe while loading module because of mismatch in names. For example, > samples/kobject/kobject-example.ko is loaded as kobject_example. > > Before applying patch: > > $ sudo ./perf probe -m /linux/samples/kobject/kobject-example.ko foo_show > Added new event: > probe:foo_show (on foo_show in kobject-example) > > You can now use it in all perf tools, such as: > > perf record -e probe:foo_show -aR sleep 1 > > $ cat /sys/kernel/debug/tracing/kprobe_events > p:probe/foo_show kobject-example:foo_show > > $ insmod kobject-example.ko > > $ lsmod > Module Size Used by > kobject_example 16384 0 > > Generate read to /sys/kernel/kobject_example/foo while recording data > with below command > $ sudo ./perf record -e probe:foo_show -a > [ perf record: Woken up 1 times to write data ] > [ perf record: Captured and wrote 0.093 MB perf.data ] > > $./perf report --stdio -F overhead,comm,dso,sym > Error: > The perf.data.old file has no samples! > > After applying patch: > > $ sudo ./perf probe -m /linux/samples/kobject/kobject-example.ko foo_show > Added new event: > probe:foo_show (on foo_show in kobject_example) > > You can now use it in all perf tools, such as: > > perf record -e probe:foo_show -aR sleep 1 > > $ sudo cat /sys/kernel/debug/tracing/kprobe_events > p:probe/foo_show kobject_example:foo_show > > $ insmod kobject-example.ko > > $ lsmod > Module Size Used by > kobject_example 16384 0 > > Generate read to /sys/kernel/kobject_example/foo while recording data > with below command > $ sudo ./perf record -e probe:foo_show -a > [ perf record: Woken up 1 times to write data ] > [ perf record: Captured and wrote 0.097 MB perf.data (8 samples) ] > > $ sudo ./perf report --stdio -F overhead,comm,dso,sym > ... > # Samples: 8 of event 'probe:foo_show' > # Event count (approx.): 8 > # > # Overhead Command Shared Object Symbol > # ........ ....... ................. ............ > # > 100.00% cat [kobject_example] [k] foo_show > Looks good to me :) Acked-by: Masami Hiramatsu Thank you! > Signed-off-by: Ravi Bangoria > --- > tools/perf/util/probe-event.c | 19 +++++-------------- > 1 file changed, 5 insertions(+), 14 deletions(-) > > diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c > index d58de20..26803e1 100644 > --- a/tools/perf/util/probe-event.c > +++ b/tools/perf/util/probe-event.c > @@ -642,32 +642,23 @@ static int add_module_to_probe_trace_events(struct probe_trace_event *tevs, > int ntevs, const char *module) > { > int i, ret = 0; > - char *tmp; > + char *mod_name = NULL; > > if (!module) > return 0; > > - tmp = strrchr(module, '/'); > - if (tmp) { > - /* This is a module path -- get the module name */ > - module = strdup(tmp + 1); > - if (!module) > - return -ENOMEM; > - tmp = strchr(module, '.'); > - if (tmp) > - *tmp = '\0'; > - tmp = (char *)module; /* For free() */ > - } > + mod_name = find_module_name(module); > > for (i = 0; i < ntevs; i++) { > - tevs[i].point.module = strdup(module); > + tevs[i].point.module = > + strdup(mod_name ? mod_name : module); > if (!tevs[i].point.module) { > ret = -ENOMEM; > break; > } > } > > - free(tmp); > + free(mod_name); > return ret; > } > > -- > 1.9.1 > -- Masami Hiramatsu