1. 19 11月, 2015 1 次提交
  2. 07 11月, 2015 2 次提交
    • W
      perf test: Add 'perf test BPF' · ba1fae43
      Wang Nan 提交于
      This patch adds BPF testcase for testing BPF event filtering.
      
      By utilizing the result of 'perf test LLVM', this patch compiles the
      eBPF sample program then test its ability. The BPF script in 'perf test
      LLVM' lets only 50% samples generated by epoll_pwait() to be captured.
      This patch runs that system call for 111 times, so the result should
      contain 56 samples.
      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: Namhyung Kim <namhyung@kernel.org>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1446817783-86722-8-git-send-email-wangnan0@huawei.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      ba1fae43
    • W
      perf bpf: Improve BPF related error messages · d3e0ce39
      Wang Nan 提交于
      A series of bpf loader related error codes were introduced to help error
      reporting. Functions were improved to return these new error codes.
      
      Functions which return pointers were adjusted to encode error codes into
      return value using the ERR_PTR() interface.
      
      bpf_loader_strerror() was improved to convert these error messages to
      strings. It checks the error codes and calls libbpf_strerror() and
      strerror_r() accordingly, so caller don't need to consider checking the
      range of the error code.
      
      In bpf__strerror_load(), print kernel version of running kernel and the
      object's 'version' section to notify user how to fix his/her program.
      
      v1 -> v2:
       Use macro for error code.
      
       Fetch error message based on array index, eliminate for-loop.
      
       Print version strings.
      
      Before:
      
        # perf record -e ./test_kversion_nomatch_program.o sleep 1
        event syntax error: './test_kversion_nomatch_program.o'
                             \___ Failed to load program: Validate your program and check 'license'/'version' sections in your object
        SKIP
      
        After:
      
        # perf record -e ./test_kversion_nomatch_program.o ls
        event syntax error: './test_kversion_nomatch_program.o'
                             \___ 'version' (4.4.0) doesn't match running kernel (4.3.0)
        SKIP
      Signed-off-by: NWang Nan <wangnan0@huawei.com>
      Tested-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1446818289-87444-1-git-send-email-wangnan0@huawei.com
      [ Add 'static inline' to bpf__strerror_prepare_load() when LIBBPF is disabled ]
      Signed-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      d3e0ce39
  3. 30 10月, 2015 1 次提交
    • W
      perf tools: Compile scriptlets to BPF objects when passing '.c' to --event · d509db04
      Wang Nan 提交于
      This patch provides infrastructure for passing source files to --event
      directly using:
      
       # perf record --event bpf-file.c command
      
      This patch does following works:
      
       1) Allow passing '.c' file to '--event'. parse_events_load_bpf() is
          expanded to allow caller tell it whether the passed file is source
          file or object.
      
       2) llvm__compile_bpf() is called to compile the '.c' file, the result
          is saved into memory. Use bpf_object__open_buffer() to load the
          in-memory object.
      
      Introduces a bpf-script-example.c so we can manually test it:
      
       # perf record --clang-opt "-DLINUX_VERSION_CODE=0x40200" --event ./bpf-script-example.c sleep 1
      
      Note that '--clang-opt' must put before '--event'.
      
      Futher patches will merge it into a testcase so can be tested automatically.
      Signed-off-by: NWang Nan <wangnan0@huawei.com>
      Acked-by: NAlexei Starovoitov <ast@plumgrid.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Daniel Borkmann <daniel@iogearbox.net>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kaixu Xia <xiakaixu@huawei.com>
      Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1444826502-49291-10-git-send-email-wangnan0@huawei.comSigned-off-by: NHe Kuang <hekuang@huawei.com>
      Signed-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      d509db04
  4. 29 10月, 2015 2 次提交
    • W
      perf bpf: Collect perf_evsel in BPF object files · 4edf30e3
      Wang Nan 提交于
      This patch creates a 'struct perf_evsel' for every probe in a BPF object
      file(s) and fills 'struct evlist' with them. The previously introduced
      dummy event is now removed. After this patch, the following command:
      
       # perf record --event filter.o ls
      
      Can trace on each of the probes defined in filter.o.
      
      The core of this patch is bpf__foreach_tev(), which calls a callback
      function for each 'struct probe_trace_event' event for a bpf program
      with each associated file descriptors. The add_bpf_event() callback
      creates evsels by calling parse_events_add_tracepoint().
      
      Since bpf-loader.c will not be built if libbpf is turned off, an empty
      bpf__foreach_tev() is defined in bpf-loader.h to avoid build errors.
      
      Committer notes:
      
      Before:
      
        # /tmp/oldperf record --event /tmp/foo.o -a usleep 1
        [ perf record: Woken up 1 times to write data ]
        [ perf record: Captured and wrote 0.198 MB perf.data ]
        # perf evlist
        /tmp/foo.o
        # perf evlist -v
        /tmp/foo.o: type: 1, size: 112, config: 0x9, { sample_period,
        sample_freq }: 4000, sample_type: IP|TID|TIME|CPU|PERIOD, disabled: 1,
        inherit: 1, mmap: 1, comm: 1, freq: 1, task: 1, sample_id_all: 1,
        exclude_guest: 1, mmap2: 1, comm_exec: 1
      
      I.e. we create just the PERF_TYPE_SOFTWARE (type: 1),
      PERF_COUNT_SW_DUMMY(config 0x9) event, now, with this patch:
      
        # perf record --event /tmp/foo.o -a usleep 1
        [ perf record: Woken up 1 times to write data ]
        [ perf record: Captured and wrote 0.210 MB perf.data ]
        # perf evlist -v
        perf_bpf_probe:fork: type: 2, size: 112, config: 0x6bd, { sample_period,
        sample_freq }: 1, sample_type: IP|TID|TIME|CPU|PERIOD|RAW, disabled: 1,
        inherit: 1, mmap: 1, comm: 1, task: 1, sample_id_all: 1, exclude_guest:
        1, mmap2: 1, comm_exec: 1
        #
      
      We now have a PERF_TYPE_SOFTWARE (type: 1), but the config states 0x6bd,
      which is how, after setting up the event via the kprobes interface, the
      'perf_bpf_probe:fork' event is accessible via the perf_event_open
      syscall. This is all transient, as soon as the 'perf record' session
      ends, these probes will go away.
      
      To see how it looks like, lets try doing a neverending session, one that
      expects a control+C to end:
      
        # perf record --event /tmp/foo.o -a
      
      So, with that in place, we can use 'perf probe' to see what is in place:
      
        # perf probe -l
          perf_bpf_probe:fork  (on _do_fork@acme/git/linux/kernel/fork.c)
      
      We also can use debugfs:
      
        [root@felicio ~]# cat /sys/kernel/debug/tracing/kprobe_events
        p:perf_bpf_probe/fork _text+638512
      
      Ok, now lets stop and see if we got some forks:
      
        [root@felicio linux]# perf record --event /tmp/foo.o -a
        ^C[ perf record: Woken up 1 times to write data ]
        [ perf record: Captured and wrote 0.325 MB perf.data (111 samples) ]
      
        [root@felicio linux]# perf script
            sshd  1271 [003] 81797.507678: perf_bpf_probe:fork: (ffffffff8109be30)
            sshd 18309 [000] 81797.524917: perf_bpf_probe:fork: (ffffffff8109be30)
            sshd 18309 [001] 81799.381603: perf_bpf_probe:fork: (ffffffff8109be30)
            sshd 18309 [001] 81799.408635: perf_bpf_probe:fork: (ffffffff8109be30)
        <SNIP>
      
      Sure enough, we have 111 forks :-)
      
      Callchains seems to work as well:
      
        # perf report --stdio --no-child
        # To display the perf.data header info, please use --header/--header-only options.
        #
        # Total Lost Samples: 0
        #
        # Samples: 562  of event 'perf_bpf_probe:fork'
        # Event count (approx.): 562
        #
        # Overhead  Command   Shared Object     Symbol
        # ........  ........  ................  ............
        #
            44.66%  sh        [kernel.vmlinux]  [k] _do_fork
                          |
                          ---_do_fork
                             entry_SYSCALL_64_fastpath
                             __libc_fork
                             make_child
      
          26.16%  make      [kernel.vmlinux]  [k] _do_fork
      <SNIP>
        #
      Signed-off-by: NWang Nan <wangnan0@huawei.com>
      Tested-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Alexei Starovoitov <ast@plumgrid.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Daniel Borkmann <daniel@iogearbox.net>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kaixu Xia <xiakaixu@huawei.com>
      Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1444826502-49291-7-git-send-email-wangnan0@huawei.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      4edf30e3
    • W
      perf tools: Load eBPF object into kernel · 1e5e3ee8
      Wang Nan 提交于
      This patch utilizes bpf_object__load() provided by libbpf to load all
      objects into kernel.
      
      Committer notes:
      
      Testing it:
      
      When using an incorrect kernel version number, i.e., having this in your
      eBPF proggie:
      
        int _version __attribute__((section("version"), used)) = 0x40100;
      
      For a 4.3.0-rc6+ kernel, say, this happens and needs checking at event
      parsing time, to provide a better error report to the user:
      
        # perf record --event /tmp/foo.o sleep 1
        libbpf: load bpf program failed: Invalid argument
        libbpf: -- BEGIN DUMP LOG ---
        libbpf:
      
        libbpf: -- END LOG --
        libbpf: failed to load program 'fork=_do_fork'
        libbpf: failed to load object '/tmp/foo.o'
        event syntax error: '/tmp/foo.o'
                             \___ Invalid argument: Are you root and runing a CONFIG_BPF_SYSCALL kernel?
      
        (add -v to see detail)
        Run 'perf list' for a list of valid events
      
         Usage: perf record [<options>] [<command>]
            or: perf record [<options>] -- <command> [<options>]
      
            -e, --event <event>   event selector. use 'perf list' to list available events
      
      If we instead make it match, i.e. use 0x40300 on this v4.3.0-rc6+
      kernel, the whole process goes thru:
      
        # perf record --event /tmp/foo.o -a usleep 1
        [ perf record: Woken up 1 times to write data ]
        [ perf record: Captured and wrote 0.202 MB perf.data ]
        # perf evlist -v
        /tmp/foo.o: type: 1, size: 112, config: 0x9, { sample_period,
        sample_freq }: 4000, sample_type: IP|TID|TIME|CPU|PERIOD, disabled: 1,
        inherit: 1, mmap: 1, comm: 1, freq: 1, task: 1, sample_id_all: 1,
        exclude_guest: 1, mmap2: 1, comm_exec: 1
        #
      Signed-off-by: NWang Nan <wangnan0@huawei.com>
      Tested-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Alexei Starovoitov <ast@plumgrid.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Daniel Borkmann <daniel@iogearbox.net>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kaixu Xia <xiakaixu@huawei.com>
      Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Paul Mackerras <paulus@samba.org>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1444826502-49291-6-git-send-email-wangnan0@huawei.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      1e5e3ee8
  5. 28 10月, 2015 2 次提交
    • W
      perf tools: Create probe points for BPF programs · aa3abf30
      Wang Nan 提交于
      This patch introduces bpf__{un,}probe() functions to enable callers to
      create kprobe points based on section names a BPF program. It parses the
      section names in the program and creates corresponding 'struct
      perf_probe_event' structures. The parse_perf_probe_command() function is
      used to do the main parsing work. The resuling 'struct perf_probe_event'
      is stored into program private data for further using.
      
      By utilizing the new probing API, this patch creates probe points during
      event parsing.
      
      To ensure probe points be removed correctly, register an atexit hook so
      even perf quit through exit() bpf__clear() is still called, so probing
      points are cleared. Note that bpf_clear() should be registered before
      bpf__probe() is called, so failure of bpf__probe() can still trigger
      bpf__clear() to remove probe points which are already probed.
      
      strerror style error reporting scaffold is created by this patch.
      bpf__strerror_probe() is the first error reporting function in
      bpf-loader.c.
      
      Committer note:
      
      Trying it:
      
      To build a test eBPF object file:
      
      I am testing using a script I built from the 'perf test -v LLVM' output:
      
        $ cat ~/bin/hello-ebpf
        export KERNEL_INC_OPTIONS="-nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/4.8.3/include -I/home/acme/git/linux/arch/x86/include -Iarch/x86/include/generated/uapi -Iarch/x86/include/generated -I/home/acme/git/linux/include -Iinclude -I/home/acme/git/linux/arch/x86/include/uapi -Iarch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -Iinclude/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h"
        export WORKING_DIR=/lib/modules/4.2.0/build
        export CLANG_SOURCE=-
        export CLANG_OPTIONS=-xc
      
        OBJ=/tmp/foo.o
        rm -f $OBJ
        echo '__attribute__((section("fork=do_fork"), used)) int fork(void *ctx) {return 0;} char _license[] __attribute__((section("license"), used)) = "GPL";int _version __attribute__((section("version"), used)) = 0x40100;' | \
        clang -D__KERNEL__ $CLANG_OPTIONS $KERNEL_INC_OPTIONS -Wno-unused-value -Wno-pointer-sign -working-directory $WORKING_DIR -c "$CLANG_SOURCE" -target bpf -O2 -o /tmp/foo.o && file $OBJ
      
       ---
      
      First asking to put a probe in a function not present in the kernel
      (misses the initial _):
      
        $ perf record --event /tmp/foo.o sleep 1
        Probe point 'do_fork' not found.
        event syntax error: '/tmp/foo.o'
                             \___ You need to check probing points in BPF file
      
        (add -v to see detail)
        Run 'perf list' for a list of valid events
      
         Usage: perf record [<options>] [<command>]
            or: perf record [<options>] -- <command> [<options>]
      
            -e, --event <event>   event selector. use 'perf list' to list available events
        $
      
       ---
      
      Now, with "__attribute__((section("fork=_do_fork"), used)):
      
       $ grep _do_fork /proc/kallsyms
       ffffffff81099ab0 T _do_fork
       $ perf record --event /tmp/foo.o sleep 1
       Failed to open kprobe_events: Permission denied
       event syntax error: '/tmp/foo.o'
                            \___ Permission denied
      
       ---
      
      Cool, we need to provide some better hints, "kprobe_events" is too low
      level, one doesn't strictly need to know the precise details of how
      these things are put in place, so something that shows the command
      needed to fix the permissions would be more helpful.
      
      Lets try as root instead:
      
        # perf record --event /tmp/foo.o sleep 1
        Lowering default frequency rate to 1000.
        Please consider tweaking /proc/sys/kernel/perf_event_max_sample_rate.
        [ perf record: Woken up 1 times to write data ]
        [ perf record: Captured and wrote 0.013 MB perf.data ]
        # perf evlist
        /tmp/foo.o
        [root@felicio ~]# perf evlist -v
        /tmp/foo.o: type: 1, size: 112, config: 0x9, { sample_period,
        sample_freq }: 1000, sample_type: IP|TID|TIME|PERIOD, disabled: 1,
        inherit: 1, mmap: 1, comm: 1, freq: 1, enable_on_exec: 1, task: 1,
        sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1
      
       ---
      Signed-off-by: NWang Nan <wangnan0@huawei.com>
      Tested-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Alexei Starovoitov <ast@plumgrid.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Daniel Borkmann <daniel@iogearbox.net>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kaixu Xia <xiakaixu@huawei.com>
      Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1444826502-49291-5-git-send-email-wangnan0@huawei.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      aa3abf30
    • W
      perf ebpf: Add the libbpf glue · 69d262a9
      Wang Nan 提交于
      The 'bpf-loader.[ch]' files are introduced in this patch. Which will be
      the interface between perf and libbpf. bpf__prepare_load() resides in
      bpf-loader.c. Following patches will enrich these two files.
      Signed-off-by: NWang Nan <wangnan0@huawei.com>
      Acked-by: NAlexei Starovoitov <ast@plumgrid.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Daniel Borkmann <daniel@iogearbox.net>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kaixu Xia <xiakaixu@huawei.com>
      Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1444826502-49291-3-git-send-email-wangnan0@huawei.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      69d262a9