From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756027AbZJLKb4 (ORCPT ); Mon, 12 Oct 2009 06:31:56 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1755132AbZJLKbz (ORCPT ); Mon, 12 Oct 2009 06:31:55 -0400 Received: from mail-bw0-f210.google.com ([209.85.218.210]:37811 "EHLO mail-bw0-f210.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754890AbZJLKbx convert rfc822-to-8bit (ORCPT ); Mon, 12 Oct 2009 06:31:53 -0400 DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:content-transfer-encoding; b=GQ4RHerJZVH3eXhH2yMi+D9UFPDechEJE1jGIaoTB20tWCHNnUKUCxHH9RIbnQs6XP 9abWQ+yQgifb8Gx5fITXSHDcsK1bUPEIEjwwrq7X54rmqGvPlbyB4t+mQ62E8mREmIp8 F6z6pc6MY53dSAnGW0bCBjurv6KzojYScuS0Y= MIME-Version: 1.0 In-Reply-To: <20091008211737.29299.14784.stgit@dhcp-100-2-132.bos.redhat.com> References: <4ACE56EE.8060000@redhat.com> <20091008211737.29299.14784.stgit@dhcp-100-2-132.bos.redhat.com> Date: Mon, 12 Oct 2009 12:31:16 +0200 Message-ID: Subject: Re: [PATCH tracing/kprobes v4] perf: Add perf probe subcommand for kprobe-event setup helper From: =?ISO-8859-1?Q?Fr=E9d=E9ric_Weisbecker?= To: Masami Hiramatsu Cc: Steven Rostedt , Ingo Molnar , lkml , systemtap , DLE , Thomas Gleixner , Arnaldo Carvalho de Melo , Mike Galbraith , Paul Mackerras , Peter Zijlstra , Christoph Hellwig , Ananth N Mavinakayanahalli , Jim Keniston , "Frank Ch. Eigler" Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8BIT Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 2009/10/8 Masami Hiramatsu : > Add perf probe subcommand for kprobe-event setup helper to perf command. > This allows user to define kprobe events by C expressions (C line numbers, > C function names, and C local variables). > > Usage > ----- >  perf probe [] -P 'PROBEDEF' [-P 'PROBEDEF' ...] > >    -k, --vmlinux  vmlinux/module pathname >    -P, --probe >                          probe point definition, where >                p:      kprobe probe >                r:      kretprobe probe >                GRP:    Group name (optional) >                NAME:   Event name >                FUNC:   Function name >                OFFS:   Offset from function entry (in byte) >                SRC:    Source code path >                LINE:   Line number >                ARG:    Probe argument (local variable name or >                        kprobe-tracer argument format is supported.) > > Changes in v4: >  - Add _GNU_SOURCE macro for strndup(). > > Changes in v3: >  - Remove -r option because perf always be used for online kernel. >  - Check malloc/calloc results. > > Changes in v2: >  - Check synthesized string length. >  - Rename perf kprobe to perf probe. >  - Use spaces for separator and update usage comment. >  - Check error paths in parse_probepoint(). >  - Check optimized-out variables. > > Signed-off-by: Masami Hiramatsu > Cc: Frederic Weisbecker > Cc: Ingo Molnar > Cc: Thomas Gleixner > Cc: Arnaldo Carvalho de Melo > Cc: Steven Rostedt > Cc: Mike Galbraith > Cc: Paul Mackerras > Cc: Peter Zijlstra > Cc: Christoph Hellwig > Cc: Ananth N Mavinakayanahalli > Cc: Jim Keniston > Cc: Frank Ch. Eigler > --- > [...] > +/* Default vmlinux search paths */ > +#define NR_SEARCH_PATH 3 > +const char *default_search_path[NR_SEARCH_PATH] = { > +"/lib/modules/%s/build/vmlinux",               /* Custom build kernel */ > +"/usr/lib/debug/lib/modules/%s/vmlinux",       /* Red Hat debuginfo */ > +"/boot/vmlinux-debug-%s",                      /* Ubuntu */ > +}; [...] > +static int open_default_vmlinux(void) > +{ > +       struct utsname uts; > +       char fname[MAX_PATH_LEN]; > +       int fd, ret, i; > + > +       ret = uname(&uts); > +       if (ret) { > +               debug("uname() failed.\n"); > +               return -errno; > +       } > +       session.release = uts.release; > +       for (i = 0; i < NR_SEARCH_PATH; i++) { > +               ret = snprintf(fname, MAX_PATH_LEN, > +                              default_search_path[i], session.release); > +               if (ret >= MAX_PATH_LEN || ret < 0) { > +                       debug("Filename(%d,%s) is too long.\n", i, uts.release); > +                       errno = E2BIG; > +                       return -E2BIG; > +               } > +               debug("try to open %s\n", fname); > +               fd = open(fname, O_RDONLY); > +               if (fd >= 0) > +                       break; > +       } > +       return fd; > +} We have a kind of kernel path finder already inside perf. It might be encapsulated inside the load_kernel() helper, I don't remember exactly. It would be better to make use of such centralized and already existing facility. The patchset looks good. I'll apply and push it soon. Thanks a lot!