1. 14 7月, 2016 17 次提交
    • M
      perf probe: Support a special SDT probe format · 7e9fca51
      Masami Hiramatsu 提交于
      Support a special SDT probe format which can omit the '%' prefix only if
      the SDT group name starts with "sdt_". So, for example both of
      "%sdt_libc:setjump" and "sdt_libc:setjump" are acceptable for perf probe
      --add.
      
      E.g. without this:
      
        # perf probe -a sdt_libc:setjmp
        Semantic error :There is non-digit char in line number.
        ...
      
      With this:
      
        # perf probe -a sdt_libc:setjmp
        Added new event:
          sdt_libc:setjmp      (on %setjmp in /usr/lib64/libc-2.20.so)
      
        You can now use it in all perf tools, such as:
      
        	perf record -e sdt_libc:setjmp -aR sleep 1
      Suggested-by: NBrendan Gregg <brendan.d.gregg@gmail.com>
      Signed-off-by: NMasami Hiramatsu <mhiramat@kernel.org>
      Tested-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/146831794674.17065.13359473252168740430.stgit@devboxSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      7e9fca51
    • M
      perf probe: Support @BUILDID or @file suffix for SDT events · a598180a
      Masami Hiramatsu 提交于
      Support @BUILDID or @file suffix for SDT events. This allows perf to add
      probes on SDTs/pre-cached events on given FILE or the file which has
      given BUILDID (also, this complements BUILDID.)
      
      For example, both gcc and libstdc++ has same SDTs as below.  If you
      would like to add a probe on sdt_libstdcxx:catch on gcc, you can do as
      below.
      
        ----
        # perf list sdt | tail -n 6
          sdt_libstdcxx:catch@/usr/bin/gcc(0cc207fc4b27)     [SDT event]
          sdt_libstdcxx:catch@/usr/lib64/libstdc++.so.6.0.20(91c7a88fdf49)
          sdt_libstdcxx:rethrow@/usr/bin/gcc(0cc207fc4b27)   [SDT event]
          sdt_libstdcxx:rethrow@/usr/lib64/libstdc++.so.6.0.20(91c7a88fdf49)
          sdt_libstdcxx:throw@/usr/bin/gcc(0cc207fc4b27)     [SDT event]
          sdt_libstdcxx:throw@/usr/lib64/libstdc++.so.6.0.20(91c7a88fdf49)
        # perf probe -a %sdt_libstdcxx:catch@0cc
        Added new event:
          sdt_libstdcxx:catch  (on %catch in /usr/bin/gcc)
      
        You can now use it in all perf tools, such as:
      
        	perf record -e sdt_libstdcxx:catch -aR sleep 1
        ----
      
      Committer note:
      
      Doing the full sequence of steps to get the results above:
      
      With a clean build-id cache:
      
        [root@jouet ~]# rm -rf ~/.debug/
        [root@jouet ~]# perf list sdt
      
        List of pre-defined events (to be used in -e):
      
        [root@jouet ~]#
      
      No events whatsoever, then, we can add all events in gcc to the build-id
      cache, doing a --add + --dry-run:
      
        [root@jouet ~]# perf probe --dry-run --cache -x /usr/bin/gcc --add %sdt_libstdcxx:\*
        Added new events:
          sdt_libstdcxx:throw  (on %* in /usr/bin/gcc)
          sdt_libstdcxx:rethrow (on %* in /usr/bin/gcc)
          sdt_libstdcxx:catch  (on %* in /usr/bin/gcc)
      
        You can now use it in all perf tools, such as:
      
      	perf record -e sdt_libstdcxx:catch -aR sleep 1
      
        [root@jouet ~]#
      
      It really didn't add any events, it just cached them:
      
        [root@jouet ~]# perf probe -l
        [root@jouet ~]#
      
      We can see that it was cached as:
      
        [root@jouet ~]# ls -la ~/.debug/usr/bin/gcc/9a0730e2bcc6d2a2003d21ac46807e8ee6bcb7c2/
        total 976
        drwxr-xr-x. 2 root root   4096 Jul 13 21:47 .
        drwxr-xr-x. 3 root root   4096 Jul 13 21:47 ..
        -rwxr-xr-x. 4 root root 985912 Jun 22 18:52 elf
        -rw-r--r--. 1 root root    303 Jul 13 21:47 probes
        [root@jouet ~]# file ~/.debug/usr/bin/gcc/9a0730e2bcc6d2a2003d21ac46807e8ee6bcb7c2/elf
        /root/.debug/usr/bin/gcc/9a0730e2bcc6d2a2003d21ac46807e8ee6bcb7c2/elf: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=9a0730e2bcc6d2a2003d21ac46807e8ee6bcb7c2, stripped
        [root@jouet ~]# cat ~/.debug/usr/bin/gcc/9a0730e2bcc6d2a2003d21ac46807e8ee6bcb7c2/probes
        %sdt_libstdcxx:throw=throw
        p:sdt_libstdcxx/throw /usr/bin/gcc:0x71ffd
        %sdt_libstdcxx:rethrow=rethrow
        p:sdt_libstdcxx/rethrow /usr/bin/gcc:0x720b8
        %sdt_libstdcxx:catch=catch
        p:sdt_libstdcxx/catch /usr/bin/gcc:0x7307f
        %sdt_libgcc:unwind=unwind
        p:sdt_libgcc/unwind /usr/bin/gcc:0x7eec0
        #sdt_libstdcxx:*=%*
        [root@jouet ~]#
      
      Ok, now we can use 'perf probe' to refer to those cached entries as:
      
        Humm, nope, doing as above we end up with:
      
        [root@jouet ~]# perf probe -a %sdt_libstdcxx:catch
        Semantic error :* is bad for event name -it must follow C symbol-naming rule.
          Error: Failed to add events.
        [root@jouet ~]#
      
      But it worked at some point, lets try not using --dry-run:
      
      Resetting everything:
      
        # rm -rf ~/.debug/
        # perf probe -d *:*
        # perf probe -l
        # perf list sdt
      
          List of pre-defined events (to be used in -e):
      
        #
      
      Ok, now it cached everything, even things we haven't asked it to
      (sdt_libgcc:unwind):
      
        [root@jouet ~]# perf probe -x /usr/bin/gcc --add %sdt_libstdcxx:\*
        Added new events:
          sdt_libstdcxx:throw  (on %* in /usr/bin/gcc)
          sdt_libstdcxx:rethrow (on %* in /usr/bin/gcc)
          sdt_libstdcxx:catch  (on %* in /usr/bin/gcc)
      
        You can now use it in all perf tools, such as:
      
      	perf record -e sdt_libstdcxx:catch -aR sleep 1
      
        [root@jouet ~]# perf list sdt
      
        List of pre-defined events (to be used in -e):
      
          sdt_libgcc:unwind                                  [SDT event]
          sdt_libstdcxx:catch                                [SDT event]
          sdt_libstdcxx:rethrow                              [SDT event]
          sdt_libstdcxx:throw                                [SDT event]
        [root@jouet ~]#
      
      And we have the events in place:
      
        [root@jouet ~]# perf probe -l
          sdt_libstdcxx:catch  (on execute_cfa_program+1551@../../../libgcc/unwind-dw2.c in /usr/bin/gcc)
          sdt_libstdcxx:rethrow (on d_print_subexpr+280@libsupc++/cp-demangle.c in /usr/bin/gcc)
          sdt_libstdcxx:throw  (on d_print_subexpr+93@libsupc++/cp-demangle.c in /usr/bin/gcc)
        [root@jouet ~]#
      
      And trying to use them at least has 'perf trace --event sdt*:*' working.
      
      Then, if we try to add the ones in libstdc++:
      
        [root@jouet ~]# perf probe -x /usr/lib64/libstdc++.so.6 -a %sdt_libstdcxx:\*
        Error: event "catch" already exists.
         Hint: Remove existing event by 'perf probe -d'
               or force duplicates by 'perf probe -f'
               or set 'force=yes' in BPF source.
          Error: Failed to add events.
        [root@jouet ~]#
      
      Doesn't work, dups, but at least this served to, unbeknownst to the user, add
      the SDT probes in /usr/lib64/libstdc++.so.6!
      
        [root@jouet ~]# perf list sdt
      
        List of pre-defined events (to be used in -e):
      
          sdt_libgcc:unwind                                  [SDT event]
          sdt_libstdcxx:catch@/usr/bin/gcc(9a0730e2bcc6)     [SDT event]
          sdt_libstdcxx:catch@/usr/lib64/libstdc++.so.6.0.22(ef2b7066559a) [SDT event]
          sdt_libstdcxx:rethrow@/usr/bin/gcc(9a0730e2bcc6)   [SDT event]
          sdt_libstdcxx:rethrow@/usr/lib64/libstdc++.so.6.0.22(ef2b7066559a) [SDT event]
          sdt_libstdcxx:throw@/usr/bin/gcc(9a0730e2bcc6)     [SDT event]
          sdt_libstdcxx:throw@/usr/lib64/libstdc++.so.6.0.22(ef2b7066559a) [SDT event]
        [root@jouet ~]#
      
      Now we should be able to get to the original cset comment, if we remove all
      SDTs events in place, not from the cache, from the kernel, where it was set up as:
      
        [root@jouet ~]# ls -la /sys/kernel/debug/tracing/events/sdt_libstdcxx/
        total 0
        drwxr-xr-x.  5 root root 0 Jul 13 22:00 .
        drwxr-xr-x. 80 root root 0 Jul 13 21:56 ..
        drwxr-xr-x.  2 root root 0 Jul 13 22:00 catch
        -rw-r--r--.  1 root root 0 Jul 13 22:00 enable
        -rw-r--r--.  1 root root 0 Jul 13 22:00 filter
        drwxr-xr-x.  2 root root 0 Jul 13 22:00 rethrow
        drwxr-xr-x.  2 root root 0 Jul 13 22:00 throw
        [root@jouet ~]#
      
        [root@jouet ~]# head -2 /sys/kernel/debug/tracing/events/sdt_libstdcxx/throw/format
        name: throw
        ID: 2059
        [root@jouet ~]#
      
      Now to remove it:
      
        [root@jouet ~]# perf probe -d sdt_libstdc*:*
        Removed event: sdt_libstdcxx:catch
        Removed event: sdt_libstdcxx:rethrow
        Removed event: sdt_libstdcxx:throw
        [root@jouet ~]#
      
      Which caused:
      
        [root@jouet ~]# ls -la /sys/kernel/debug/tracing/events/sdt_libstdcxx/
        ls: cannot access '/sys/kernel/debug/tracing/events/sdt_libstdcxx/': No such file or directory
        [root@jouet ~]#
      
      Ok, now we can do:
      
        [root@jouet ~]# perf list sdt_libstdcxx:catch
      
        List of pre-defined events (to be used in -e):
      
          sdt_libstdcxx:catch@/usr/bin/gcc(9a0730e2bcc6)     [SDT event]
          sdt_libstdcxx:catch@/usr/lib64/libstdc++.so.6.0.22(ef2b7066559a) [SDT event]
        [root@jouet ~]#
      
      So, these are not really 'pre-defined events', i.e. we can't use them with
      'perf record --event':
      
        [root@jouet ~]# perf record --event sdt_libstdcxx:catch*
        event syntax error: 'sdt_libstdcxx:catch*'
                             \___ unknown tracepoint
      
        Error:	File /sys/kernel/debug/tracing/events/sdt_libstdcxx/catch* not found.
        Hint:	Perhaps this kernel misses some CONFIG_ setting to enable this feature?.
      <SNIP>
        [root@jouet ~]#
      
      To have it really pre-defined we must use perf probe to get its definition from
      the cache and set it up in the kernel, creating the tracepoint to _then_ use it
      with 'perf record --event':
      
        [root@jouet ~]# perf probe -a sdt_libstdcxx:catch
        Semantic error :There is non-digit char in line number.
        <SNIP>
      
      Oops, there is another gotcha here, we need that pesky '%' character:
      
        [root@jouet ~]# perf probe -a %sdt_libstdcxx:catch
        Added new events:
          sdt_libstdcxx:catch  (on %catch in /usr/bin/gcc)
          sdt_libstdcxx:catch_1 (on %catch in /usr/lib64/libstdc++.so.6.0.22)
      
        You can now use it in all perf tools, such as:
      
      	perf record -e sdt_libstdcxx:catch_1 -aR sleep 1
      
        [root@jouet ~]#
      
      But then we added _two_ events, one with the name we expected, the other one
      with a _ added, when doing the analysis we need to pay attention to who maps to
      who.
      
      And here is where we get to the point of this patch, which is to be able to
      disambiguate those definitions for 'catch' in the build-id cache, but first we need
      remove those events we just added:
      
      [root@jouet ~]# perf probe -d %sdt_libstdcxx:catch
      
      Oops, that didn't remove anything, we need to _remove_ that % char in this case:
      
        [root@jouet ~]# perf probe -d sdt_libstdcxx:catch
        Removed event: sdt_libstdcxx:catch
      
      And we need to remove the other event added, i.e. I forgot to add a * at the end:
      
        [root@jouet ~]# perf probe -d sdt_libstdcxx:catch*
        Removed event: sdt_libstdcxx:catch_1
        [root@jouet ~]#
      
      Ok, disambiguating it using what is in this patch:
      
        [root@jouet ~]# perf list sdt_libstdcxx:catch
      
        List of pre-defined events (to be used in -e):
      
          sdt_libstdcxx:catch@/usr/bin/gcc(9a0730e2bcc6)     [SDT event]
          sdt_libstdcxx:catch@/usr/lib64/libstdc++.so.6.0.22(ef2b7066559a) [SDT event]
        [root@jouet ~]#
        [root@jouet ~]# perf probe -a %sdt_libstdcxx:catch@9a07
        Added new event:
          sdt_libstdcxx:catch  (on %catch in /usr/bin/gcc)
      
        You can now use it in all perf tools, such as:
      
      	perf record -e sdt_libstdcxx:catch -aR sleep 1
      
        [root@jouet ~]# perf probe -l
          sdt_libstdcxx:catch  (on execute_cfa_program+1551@../../../libgcc/unwind-dw2.c in /usr/bin/gcc)
        [root@jouet ~]#
      
      Yeah, it works! But we need to try and simplify this :-)
      
      Update: Some aspects of this simplification take place in the following
              patches.
      Signed-off-by: NMasami Hiramatsu <mhiramat@kernel.org>
      Tested-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/146831793746.17065.13065062753978236612.stgit@devboxSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      a598180a
    • M
      perf list: Show SDT and pre-cached events · 40218dae
      Masami Hiramatsu 提交于
      Show SDT and pre-cached events by perf-list with "sdt". This also shows
      the binary and build-id where the events are placed only when there are
      same name events on different binaries.
      
      e.g.:
      
        # perf list sdt
      
        List of pre-defined events (to be used in -e):
      
          sdt_libc:lll_futex_wake                            [SDT event]
          sdt_libc:lll_lock_wait_private                     [SDT event]
          sdt_libc:longjmp                                   [SDT event]
          sdt_libc:longjmp_target                            [SDT event]
        ...
          sdt_libstdcxx:rethrow@/usr/bin/gcc(0cc207fc4b27)   [SDT event]
          sdt_libstdcxx:rethrow@/usr/lib64/libstdc++.so.6.0.20(91c7a88fdf49)
          sdt_libstdcxx:throw@/usr/bin/gcc(0cc207fc4b27)     [SDT event]
          sdt_libstdcxx:throw@/usr/lib64/libstdc++.so.6.0.20(91c7a88fdf49)
      
      The binary path and build-id are shown in below format;
      
        <GROUP>:<EVENT>@<PATH>(<BUILD-ID>)
      Signed-off-by: NMasami Hiramatsu <mhiramat@kernel.org>
      Signed-off-by: NMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
      Tested-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/20160624090646.25421.44225.stgit@devboxSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      40218dae
    • M
      perf probe: Search SDT/cached event from all probe caches · 1de7b8bf
      Masami Hiramatsu 提交于
      Search SDT/cached event from all probe caches if user doesn't pass any
      binary. With this, we don't have to specify target binary for SDT and
      named cached events (which start with %).
      
      E.g. without this, a target binary must be passed with -x.
      
        # perf probe -x /usr/lib64/libc-2.20.so -a %sdt_libc:\*
      
      With this change, we don't need it anymore.
      
        # perf probe -a %sdt_libc:\*
      Signed-off-by: NMasami Hiramatsu <mhiramat@kernel.org>
      Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/146831792812.17065.2353705982669445313.stgit@devboxSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      1de7b8bf
    • M
      perf probe: Allow wildcard for cached events · 42bba263
      Masami Hiramatsu 提交于
      Allo glob wildcard for reusing cached/SDT events. E.g.
      
        # perf probe -x /usr/lib64/libc-2.20.so -a %sdt_libc:\*
      
      This example adds probes for all SDT in libc.
      Note that the SDTs must have been scanned by perf buildid-cache.
      
      Committer note:
      
      Using it to check what of those SDT probes would take place when doing
      a cargo run (rust):
      
        # trace --no-sys --event sdt_libc:* cargo run
           0.000 sdt_libc:setjmp:(7f326b69c4d1))
          28.423 sdt_libc:setjmp:(7f4b0a5364d1))
          29.000 sdt_libc:setjmp:(7f4b0a5364d1))
          88.597 sdt_libc:setjmp:(7fc01fd414d1))
          89.220 sdt_libc:setjmp:(7fc01fd414d1))
          95.501 sdt_libc:setjmp:(7f326b69c4d1))
           Running `target/debug/hello_world`
          97.110 sdt_libc:setjmp:(7f95e09234d1))
        Hello, world!
        #
      Signed-off-by: NMasami Hiramatsu <mhiramat@kernel.org>
      Tested-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/146831791813.17065.17846564230840594888.stgit@devboxSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      42bba263
    • M
      perf probe-cache: Add for_each_probe_cache_entry() wrapper · 05bf2c8a
      Masami Hiramatsu 提交于
      Add for_each_probe_cache_entry() wrapper macro for hiding list in
      probe_cache.
      Signed-off-by: NMasami Hiramatsu <mhiramat@kernel.org>
      Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/146831790386.17065.15082256697569419710.stgit@devboxSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      05bf2c8a
    • M
      perf probe: Make --list show only available cached events · c3492a3a
      Masami Hiramatsu 提交于
      Make "perf probe --cache --list" show only available cached events by
      checking build-id validity.
      
      E.g. without this patch:
        ----
        $ ./perf probe --cache --add oldevent=cmd_probe
        $ make #(to update ./perf)
        $ ./perf probe --cache --add newevent=cmd_probe
        $ ./perf probe --cache --list
        /home/mhiramat/ksrc/linux/tools/perf/perf (061e90539bac69
        probe_perf:newevent=cmd_probe
        /home/mhiramat/ksrc/linux/tools/perf/perf (c2e44d614e33e1
        probe_perf:oldevent=cmd_probe
        ----
      It shows both of old and new events but user can not use old one.
      With this;
        ----
        $ ./perf probe --cache -l
        /home/mhiramat/ksrc/linux/tools/perf/perf (061e90539bac69
        probe_perf:newevent=cmd_probe
        ----
      
      This shows only new events which are on the existing binary.
      Signed-off-by: NMasami Hiramatsu <mhiramat@kernel.org>
      Signed-off-by: NMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
      Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/146831789417.17065.17896487479879669610.stgit@devboxSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      c3492a3a
    • M
      perf probe: Accept %sdt and %cached event name · 36a009fe
      Masami Hiramatsu 提交于
      To improve usability, support %[PROVIDER:]SDTEVENT format to add new
      probes on SDT and cached events.
      
      e.g.
        ----
        # perf probe -x /lib/libc-2.17.so  %lll_lock_wait_private
        Added new event:
          sdt_libc:lll_lock_wait_private (on %lll_lock_wait_private in /usr/lib/libc-2.17.so)
      
        You can now use it in all perf tools, such as:
      
                perf record -e sdt_libc:lll_lock_wait_private -aR sleep 1
      
        # perf probe -l | more
          sdt_libc:lll_lock_wait_private (on __lll_lock_wait_private+21 in /usr/lib/libc-2.17.so)
        ----
      
      Note that this is not only for SDT events, but also normal
      events with event-name.
      
      e.g. define "myevent" on cache (-n doesn't add the real probe)
        ----
        # perf probe -x ./perf --cache -n --add 'myevent=dso__load $params'
        ----
        Reuse the "myevent" from cache as below.
        ----
        # perf probe -x ./perf %myevent
        ----
      Signed-off-by: NMasami Hiramatsu <mhiramat@kernel.org>
      Signed-off-by: NMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
      Tested-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/146831788372.17065.3645054540325909346.stgit@devboxSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      36a009fe
    • M
      perf probe: Fix to show correct error message for $vars and $params · f6eb0518
      Masami Hiramatsu 提交于
      Fix to show correct error messages for $vars and $params because
      those special variables requires debug information to find the
      real variables or function parameters.
      
      E.g. without this fix;
        ----
        # perf probe -x /lib64/libc-2.23.so getaddrinfo \$params
        Failed to write event: Invalid argument
        Please upgrade your kernel to at least 3.14 to have access to feature $params
          Error: Failed to add events.
        ----
      
      Perf ends up with an error, but the message is not correct.  With this
      fix, perf shows correct error message as below.
      
        ----
        # perf probe -x /lib64/libc-2.23.so getaddrinfo \$params
        The /usr/lib64/libc-2.23.so file has no debug information.
        Rebuild with -g, or install an appropriate debuginfo package.
          Error: Failed to add events.
        ----
      Reported-and-Tested-by: NArnaldo Carvalho de Melo <acme@kernel.org>
      Signed-off-by: NMasami Hiramatsu <mhiramat@kernel.org>
      Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/146831787438.17065.6152436996780110699.stgit@devboxSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      f6eb0518
    • W
      perf bpf: Support BPF program attach to tracepoints · b4ee6d41
      Wang Nan 提交于
      To support 98b5c2c6 ("perf, bpf: allow bpf programs attach to
      tracepoints"), this patch allows BPF scripts to select tracepoints in
      their section name.
      
      Example:
      
        # cat test_tracepoint.c
        /*********************************************/
        #include <uapi/linux/bpf.h>
        #define SEC(NAME) __attribute__((section(NAME), used))
        SEC("raw_syscalls:sys_enter")
        int func(void *ctx)
        {
       	/*
       	 * /sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/format:
       	 * ...
       	 * field:long id;	offset:8;	size:8;	signed:1;
       	 * ...
       	 * ctx + 8 select 'id'
       	 */
       	u64 id = *((u64 *)(ctx + 8));
       	if (id == 1)
       		return 1;
       	return 0;
        }
        SEC("_write=sys_write")
        int _write(void *ctx)
        {
       	return 1;
        }
        char _license[] SEC("license") = "GPL";
        int _version SEC("version") = LINUX_VERSION_CODE;
        /*********************************************/
        # perf record -e ./test_tracepoint.c  dd if=/dev/zero of=/dev/null count=5
        5+0 records in
        5+0 records out
        2560 bytes (2.6 kB) copied, 6.2281e-05 s, 41.1 MB/s
        [ perf record: Woken up 1 times to write data ]
        # perf script
               dd 13436 [005] 1596.490869: raw_syscalls:sys_enter: NR 1 (1, 178d000, 200, 7ffe82470d60, ffffffffffffe020, fffff
               dd 13436 [005] 1596.490871:  perf_bpf_probe:_write: (ffffffff812351e0)
               dd 13436 [005] 1596.490873: raw_syscalls:sys_enter: NR 1 (1, 178d000, 200, ffffffffffffe000, ffffffffffffe020, f
               dd 13436 [005] 1596.490874:  perf_bpf_probe:_write: (ffffffff812351e0)
               dd 13436 [005] 1596.490876: raw_syscalls:sys_enter: NR 1 (1, 178d000, 200, ffffffffffffe000, ffffffffffffe020, f
               dd 13436 [005] 1596.490876:  perf_bpf_probe:_write: (ffffffff812351e0)
               dd 13436 [005] 1596.490878: raw_syscalls:sys_enter: NR 1 (1, 178d000, 200, ffffffffffffe000, ffffffffffffe020, f
               dd 13436 [005] 1596.490879:  perf_bpf_probe:_write: (ffffffff812351e0)
               dd 13436 [005] 1596.490881: raw_syscalls:sys_enter: NR 1 (1, 178d000, 200, ffffffffffffe000, ffffffffffffe020, f
               dd 13436 [005] 1596.490882:  perf_bpf_probe:_write: (ffffffff812351e0)
               dd 13436 [005] 1596.490900: raw_syscalls:sys_enter: NR 1 (2, 7ffe8246e640, 1f, 40acb8, 7f44bac74700, 7f44baa4fba
               dd 13436 [005] 1596.490901:  perf_bpf_probe:_write: (ffffffff812351e0)
               dd 13436 [005] 1596.490917: raw_syscalls:sys_enter: NR 1 (2, 7ffe8246e640, 1a, fffffffa, 7f44bac74700, 7f44baa4f
               dd 13436 [005] 1596.490918:  perf_bpf_probe:_write: (ffffffff812351e0)
               dd 13436 [005] 1596.490932: raw_syscalls:sys_enter: NR 1 (2, 7ffe8246e640, 1a, fffffff9, 7f44bac74700, 7f44baa4f
               dd 13436 [005] 1596.490933:  perf_bpf_probe:_write: (ffffffff812351e0)
      
      Committer note:
      
      Further testing:
      
        # trace --no-sys --event /home/acme/bpf/tracepoint.c cat /etc/passwd > /dev/null
           0.000 raw_syscalls:sys_enter:NR 1 (1, 7f0490504000, c48, 7f0490503010, ffffffffffffffff, 0))
           0.006 perf_bpf_probe:_write:(ffffffff81241bc0))
        #
      Signed-off-by: NWang Nan <wangnan0@huawei.com>
      Tested-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Alexei Starovoitov <ast@kernel.org>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1468406646-21642-6-git-send-email-wangnan0@huawei.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      b4ee6d41
    • W
      perf bpf: Rename bpf__foreach_tev() to bpf__foreach_event() · cd102d70
      Wang Nan 提交于
      Following commit will allow BPF script attach to tracepoints.
      bpf__foreach_tev() will iterate over all events, not only kprobes.
      Rename it to bpf__foreach_event().
      
      Since only group and event are used by caller, there's no need to pass
      full 'struct probe_trace_event' to bpf_prog_iter_callback_t. Pass only
      these two strings. After this patch bpf_prog_iter_callback_t natually
      support tracepoints.
      Signed-off-by: NWang Nan <wangnan0@huawei.com>
      Cc: Alexei Starovoitov <ast@kernel.org>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1468406646-21642-5-git-send-email-wangnan0@huawei.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      cd102d70
    • W
      perf event parser: Add const qualifier to evt_name and sys_name · 8c619d6a
      Wang Nan 提交于
      Add missing 'const' qualifiers so following commits are able to create
      tracepoints using const strings.
      Signed-off-by: NWang Nan <wangnan0@huawei.com>
      Cc: Alexei Starovoitov <ast@kernel.org>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1468406646-21642-4-git-send-email-wangnan0@huawei.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      8c619d6a
    • W
      tools lib bpf: Report error when kernel doesn't support program type · 705fa219
      Wang Nan 提交于
      Now libbpf support tracepoint program type. Report meaningful error when kernel
      version is less than 4.7.
      Signed-off-by: NWang Nan <wangnan0@huawei.com>
      Cc: Alexei Starovoitov <ast@kernel.org>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1468406646-21642-3-git-send-email-wangnan0@huawei.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      705fa219
    • W
      tools lib bpf: New API to adjust type of a BPF program · 5f44e4c8
      Wang Nan 提交于
      Add 4 new APIs to adjust and query the type of a BPF program.
      Load program according to type set by caller. Default is set to
      BPF_PROG_TYPE_KPROBE.
      Signed-off-by: NWang Nan <wangnan0@huawei.com>
      Cc: Alexei Starovoitov <ast@kernel.org>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1468406646-21642-2-git-send-email-wangnan0@huawei.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      5f44e4c8
    • A
      objtool: Avoid checking code drift on busybox's diff · 1a4bf285
      Arnaldo Carvalho de Melo 提交于
      That doesn't have -I to match lines.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Josh Poimboeuf <jpoimboe@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: http://lkml.kernel.org/n/tip-1zqv1h6okt70e2huokkdtf1u@git.kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      1a4bf285
    • A
      objtool: Add fallback from ELF_C_READ_MMAP to ELF_C_READ · 774bec3f
      Arnaldo Carvalho de Melo 提交于
      Not all libelf implementations have this "Please, ELF_C_READ, but use
      mmap if possible" elf_begin() cmd, so provide a fallback to plain old
      ELF_C_READ.
      
      Case in point: Alpine Linux 3.4.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Josh Poimboeuf <jpoimboe@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: http://lkml.kernel.org/n/tip-1fctuknrawgoi5xqon4mu9dv@git.kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      774bec3f
    • A
      tools: Fix up BITS_PER_LONG setting · 2a00f026
      Arnaldo Carvalho de Melo 提交于
      It was set based on CONFIG_64BIT, that is available only when using
      Kconfig, which we're working towards but not to the point of having this
      CONFIG variable set, so synthesize it from available compiler defined
      defines, __SIZEOF_LONG__ or, lacking that, __WORDSIZE.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: http://lkml.kernel.org/n/tip-og5fmkr17856lhupacihwxvb@git.kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      2a00f026
  2. 13 7月, 2016 23 次提交