linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 00/30] perf clang: Builtin clang and perfhook support
@ 2016-11-26  7:03 Wang Nan
  2016-11-26  7:03 ` [PATCH v3 01/30] tools lib bpf: Add missing BPF functions Wang Nan
                   ` (29 more replies)
  0 siblings, 30 replies; 76+ messages in thread
From: Wang Nan @ 2016-11-26  7:03 UTC (permalink / raw)
  To: acme, ast
  Cc: lizefan, hekuang, linux-kernel, pi3orama, joe, Wang Nan, Jiri Olsa

This is version 3 of perf builtin clang and perfhook patch series.
Compare to v2 there is only minor changes:
 1. BPF map helpers in perf hooks now called 'perf_map_...',
    instead of 'jit_helper_map_...'.
    (Alexei Starovoitov)
 2. Rename bpf_map_{pin,get} to bpf_obj_{pin,get}, make them consist
    with kernel.
    (Joe Stringer).

Example in v2 should be changed accordingly:

  $ cat ./count_syscalls.c
  typedef unsigned long u64;
  
  #define BPF_MAP_TYPE_HASH 1
  #define BPF_MAP_TYPE_ARRAY 2
  
  enum GVAL {
      G_perf_pid,
      NR_GVALS
  };
  
  struct bpf_map_def SEC("maps") GVALS = {
      .type = BPF_MAP_TYPE_ARRAY,
      .key_size = sizeof(int),
      .value_size = sizeof(u64),
      .max_entries = NR_GVALS,
  };
  
  struct bpf_map_def SEC("maps") syscall_counter = {
      .type = BPF_MAP_TYPE_HASH,
      .key_size = sizeof(u64),
      .value_size = sizeof(u64),
      .max_entries = 512,
  };
  
  SEC("raw_syscalls:sys_enter")
  int func(void *ctx)
  {
      int key = G_perf_pid;
      u64 id = *((u64 *)(ctx + 8));
      int self_pid = bpf_get_current_pid_tgid() & 0xffffffff;
      int *perf_pid = bpf_map_lookup_elem(&GVALS, &key);
      u64 *counter;
  
      if (!perf_pid)
          return 0;
      if (*perf_pid == self_pid)
          return 0;
      counter = bpf_map_lookup_elem(&syscall_counter, &id);
      if (!counter) {
          u64 value = 1;
          bpf_map_update_elem(&syscall_counter, &id, &value, 0);
          return 0;
      }
      __sync_fetch_and_add(counter, 1);
      return 0;
  }
  
  SEC("perfhook:record_start")
  void record_start(void *ctx)
  {
      int perf_pid = getpid(), key = G_perf_pid;
      printf("Start count, perfpid=%d\n", perf_pid);
      perf_map_update_elem(ctx, &GVALS, &key, &perf_pid, 0);
  }
  
  SEC("perfhook:record_end")
  void record_end(void *ctx)
  {
      u64 key = -1, value;
      while (!perf_map_get_next_key(ctx, &syscall_counter, &key, &key)) {
          perf_map_lookup_elem(ctx, &syscall_counter, &key, &value);
          printf("syscall %ld\tcount: %ld\n", (long)key, (long)value);
      }
  }
  char _license[] SEC("license") = "GPL";
  int _version SEC("version") = LINUX_VERSION_CODE;
  $ sudo -s
  # ulimit -l unlimited
  # perf record -e ./count_syscalls.c echo "Haha"
  Start count, perfpid=25209
  Haha
  [ perf record: Woken up 1 times to write data ]
  syscall 293	count: 2
  syscall 8	count: 7
  syscall 11	count: 763
  syscall 4	count: 43
  syscall 21	count: 48
  syscall 86	count: 1
  syscall 5	count: 791
  ...

Wang Nan (30):
  tools lib bpf: Add missing BPF functions
  tools lib bpf: Add private field for bpf_object
  tools lib bpf: Retrive bpf_map through offset of bpf_map_def
  perf tools: Introduce perf hooks
  perf tools: Pass context to perf hook functions
  perf llvm: Extract helpers in llvm-utils.c
  tools build: Add feature detection for LLVM
  tools build: Add feature detection for clang
  perf build: Add clang and llvm compile and linking support
  perf clang: Add builtin clang support ant test case
  perf clang: Use real file system for #include
  perf clang: Allow passing CFLAGS to builtin clang
  perf clang: Update test case to use real BPF script
  perf clang: Support compile IR to BPF object and add testcase
  perf clang: Compile BPF script use builtin clang support
  perf clang: Pass full path to builtin clang
  perf clang: Pass CFLAGS to builtin clang
  perf clang jit: Wrap llvm::Module using PerfModule
  perf clang jit: Insignt BPF and JIT functions in a Module
  perf clang jit: add PerfModule::doJIT to JIT perfhook functions
  perf clang jit: Export functions for jitted code
  perf clang jit: Actually JIT and hook in bpf loader
  perf clang jit: Collect the lowest address in maps section as map_base
  perf clang jit: Retrive fd of BPF map from its offset
  perf clang jit: Allow jitted perf hook access BPF maps
  perf clang: Link BPF functions declaration into perf
  perf clang: Declare BPF functions for BPF scripts automatically
  perf clang: Include helpers to BPF scripts
  perf clang builtin: Define hook helpers by default
  perf clang jit: Export getpid() to perf hook

 tools/build/feature/Makefile                  |  18 +
 tools/build/feature/test-clang.cpp            |  21 ++
 tools/build/feature/test-llvm.cpp             |   8 +
 tools/lib/bpf/bpf.c                           |  56 +++
 tools/lib/bpf/bpf.h                           |   7 +
 tools/lib/bpf/libbpf.c                        |  35 ++
 tools/lib/bpf/libbpf.h                        |  13 +
 tools/perf/Makefile.config                    |  62 +++-
 tools/perf/Makefile.perf                      |  23 +-
 tools/perf/builtin-record.c                   |  11 +
 tools/perf/tests/Build                        |   4 +-
 tools/perf/tests/bpf-script-example.c         |  30 +-
 tools/perf/tests/bpf-script-test-kbuild.c     |   2 +
 tools/perf/tests/bpf-script-test-prologue.c   |   6 +-
 tools/perf/tests/bpf-script-test-relocation.c |  17 +-
 tools/perf/tests/builtin-test.c               |  13 +
 tools/perf/tests/clang.c                      |  50 +++
 tools/perf/tests/llvm.h                       |   7 +
 tools/perf/tests/make                         |   2 +
 tools/perf/tests/perf-hooks.c                 |  48 +++
 tools/perf/tests/tests.h                      |   4 +
 tools/perf/util/Build                         |   5 +
 tools/perf/util/bpf-loader.c                  | 102 +++++-
 tools/perf/util/bpf-loader.h                  |  19 +
 tools/perf/util/c++/Build                     |   4 +
 tools/perf/util/c++/bpf-funcs-str.c           | 228 ++++++++++++
 tools/perf/util/c++/bpf-helper-str.c          |  23 ++
 tools/perf/util/c++/clang-bpf-includes.h      |  13 +
 tools/perf/util/c++/clang-c.h                 |  63 ++++
 tools/perf/util/c++/clang-test.cpp            |  99 +++++
 tools/perf/util/c++/clang.cpp                 | 497 ++++++++++++++++++++++++++
 tools/perf/util/c++/clang.h                   |  61 ++++
 tools/perf/util/jit-helpers.c                 |  57 +++
 tools/perf/util/jit-helpers.h                 |  28 ++
 tools/perf/util/llvm-utils.c                  |  76 +++-
 tools/perf/util/llvm-utils.h                  |  15 +-
 tools/perf/util/perf-hooks-list.h             |   3 +
 tools/perf/util/perf-hooks.c                  |  88 +++++
 tools/perf/util/perf-hooks.h                  |  39 ++
 tools/perf/util/util-cxx.h                    |  26 ++
 40 files changed, 1830 insertions(+), 53 deletions(-)
 create mode 100644 tools/build/feature/test-clang.cpp
 create mode 100644 tools/build/feature/test-llvm.cpp
 create mode 100644 tools/perf/tests/clang.c
 create mode 100644 tools/perf/tests/perf-hooks.c
 create mode 100644 tools/perf/util/c++/Build
 create mode 100644 tools/perf/util/c++/bpf-funcs-str.c
 create mode 100644 tools/perf/util/c++/bpf-helper-str.c
 create mode 100644 tools/perf/util/c++/clang-bpf-includes.h
 create mode 100644 tools/perf/util/c++/clang-c.h
 create mode 100644 tools/perf/util/c++/clang-test.cpp
 create mode 100644 tools/perf/util/c++/clang.cpp
 create mode 100644 tools/perf/util/c++/clang.h
 create mode 100644 tools/perf/util/jit-helpers.c
 create mode 100644 tools/perf/util/jit-helpers.h
 create mode 100644 tools/perf/util/perf-hooks-list.h
 create mode 100644 tools/perf/util/perf-hooks.c
 create mode 100644 tools/perf/util/perf-hooks.h
 create mode 100644 tools/perf/util/util-cxx.h

Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexei Starovoitov <ast@fb.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Joe Stringer <joe@ovn.org>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com

-- 
2.10.1

^ permalink raw reply	[flat|nested] 76+ messages in thread
* Re: [PATCH v3 10/30] perf clang: Add builtin clang support ant test case
@ 2016-12-07  1:57 Alexei Starovoitov
  0 siblings, 0 replies; 76+ messages in thread
From: Alexei Starovoitov @ 2016-12-07  1:57 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Arnaldo Carvalho de Melo, Wang Nan, Alexei Starovoitov, Zefan Li,
	He Kuang, Ingo Molnar, linux-kernel, pi3orama, Joe Stringer,
	Jiri Olsa

On Tue, Dec 6, 2016 at 1:02 PM, Arnaldo Carvalho de Melo
<arnaldo.melo@gmail.com> wrote:
 [acme@jouet linux]$ ls -lah /tmp/perf
> -rwxr-xr-x. 1 acme acme 41M Dec  6 17:58 /tmp/perf

awesome. that's reasonable and matches to
what I see with libbcc.so
We had few tricks before to reduce it into <30M range,
but they were too fragile.

^ permalink raw reply	[flat|nested] 76+ messages in thread
* Re: [PATCH v3 10/30] perf clang: Add builtin clang support ant test case
@ 2017-01-17 18:27 Alexei Starovoitov
  2017-01-17 19:04 ` Arnaldo Carvalho de Melo
  0 siblings, 1 reply; 76+ messages in thread
From: Alexei Starovoitov @ 2017-01-17 18:27 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Wangnan (F),
	Arnaldo Carvalho de Melo, Alexei Starovoitov, Zefan Li, He Kuang,
	Ingo Molnar, linux-kernel, pi3orama, Joe Stringer, Jiri Olsa

On Tue, Jan 17, 2017 at 5:38 AM, Arnaldo Carvalho de Melo
<acme@kernel.org> wrote:
>
> [acme@jouet linux]$ ls -lah /tmp/perf
> -rwxr-xr-x. 1 acme acme 4.4M Jan 17 10:29 /tmp/perf
> [acme@jouet linux]$ size /tmp/perf
>    text    data     bss     dec     hex filename
> 3954488  622440 23912104        28489032        1b2b548 /tmp/perf
> [acme@jouet linux]$ ldd /tmp/perf | egrep -i llvm\|clang
>         libclangAST.so.40 => /usr/local/lib/libclangAST.so.40 (0x00007f4964981000)
...
>         libLLVMSystemZDisassembler.so.40 => /usr/local/lib/libLLVMSystemZDisassembler.so.40 (0x00007f495fe70000)
...
>         libLLVMSparcDisassembler.so.40 => /usr/local/lib/libLLVMSparcDisassembler.so.40 (0x00007f495f14f000)
...
>         libLLVMPowerPCDisassembler.so.40 => /usr/local/lib/libLLVMPowerPCDisassembler.so.40 (0x00007f495de94000)
...
>         libLLVMMSP430CodeGen.so.40 => /usr/local/lib/libLLVMMSP430CodeGen.so.40 (0x00007f495c79d000)
...
>         libLLVMMipsDisassembler.so.40 => /usr/local/lib/libLLVMMipsDisassembler.so.40 (0x00007f495bf73000)

I think the static binary shouldn't be including all llvm backends.
It's not clear to me why .so pulls them all.
fyi I typically configure llvm with:
-DLLVM_TARGETS_TO_BUILD="X86;BPF"

^ permalink raw reply	[flat|nested] 76+ messages in thread

end of thread, other threads:[~2017-01-17 19:04 UTC | newest]

Thread overview: 76+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-11-26  7:03 [PATCH v3 00/30] perf clang: Builtin clang and perfhook support Wang Nan
2016-11-26  7:03 ` [PATCH v3 01/30] tools lib bpf: Add missing BPF functions Wang Nan
2016-11-26 17:10   ` Alexei Starovoitov
2016-12-02 10:37   ` [tip:perf/core] " tip-bot for Wang Nan
2016-11-26  7:03 ` [PATCH v3 02/30] tools lib bpf: Add private field for bpf_object Wang Nan
2016-11-26 17:11   ` Alexei Starovoitov
2016-12-02 10:37   ` [tip:perf/core] " tip-bot for Wang Nan
2016-11-26  7:03 ` [PATCH v3 03/30] tools lib bpf: Retrive bpf_map through offset of bpf_map_def Wang Nan
2016-11-26 17:12   ` Alexei Starovoitov
2016-12-02 10:38   ` [tip:perf/core] " tip-bot for Wang Nan
2016-11-26  7:03 ` [PATCH v3 04/30] perf tools: Introduce perf hooks Wang Nan
2016-12-02 10:38   ` [tip:perf/core] " tip-bot for Wang Nan
2016-11-26  7:03 ` [PATCH v3 05/30] perf tools: Pass context to perf hook functions Wang Nan
2016-12-06  8:21   ` [tip:perf/core] " tip-bot for Wang Nan
2016-11-26  7:03 ` [PATCH v3 06/30] perf llvm: Extract helpers in llvm-utils.c Wang Nan
2016-12-06  8:21   ` [tip:perf/core] " tip-bot for Wang Nan
2016-11-26  7:03 ` [PATCH v3 07/30] tools build: Add feature detection for LLVM Wang Nan
2016-12-06  8:22   ` [tip:perf/core] " tip-bot for Wang Nan
2016-11-26  7:03 ` [PATCH v3 08/30] tools build: Add feature detection for clang Wang Nan
2016-12-06  8:22   ` [tip:perf/core] " tip-bot for Wang Nan
2016-11-26  7:03 ` [PATCH v3 09/30] perf build: Add clang and llvm compile and linking support Wang Nan
2016-12-06  8:23   ` [tip:perf/core] " tip-bot for Wang Nan
2016-11-26  7:03 ` [PATCH v3 10/30] perf clang: Add builtin clang support ant test case Wang Nan
2016-11-26 17:17   ` Alexei Starovoitov
2016-11-28  7:41     ` Wangnan (F)
2016-12-02 15:44   ` Arnaldo Carvalho de Melo
2016-12-05  2:36     ` Wangnan (F)
2016-12-05  4:41       ` Wangnan (F)
2017-01-17 13:38         ` Arnaldo Carvalho de Melo
2016-12-05 16:51     ` Alexei Starovoitov
2016-12-05 21:02       ` Arnaldo Carvalho de Melo
2016-12-05 21:48         ` Arnaldo Carvalho de Melo
2016-12-06  2:07           ` Wangnan (F)
2016-12-06 13:43             ` Arnaldo Carvalho de Melo
2016-12-06 19:19       ` Arnaldo Carvalho de Melo
2016-12-06 21:02         ` Arnaldo Carvalho de Melo
2016-12-06  8:23   ` [tip:perf/core] " tip-bot for Wang Nan
2016-11-26  7:03 ` [PATCH v3 11/30] perf clang: Use real file system for #include Wang Nan
2016-12-06  8:24   ` [tip:perf/core] " tip-bot for Wang Nan
2016-11-26  7:03 ` [PATCH v3 12/30] perf clang: Allow passing CFLAGS to builtin clang Wang Nan
2016-12-06  8:25   ` [tip:perf/core] " tip-bot for Wang Nan
2016-11-26  7:03 ` [PATCH v3 13/30] perf clang: Update test case to use real BPF script Wang Nan
2016-12-06  8:25   ` [tip:perf/core] " tip-bot for Wang Nan
2016-11-26  7:03 ` [PATCH v3 14/30] perf clang: Support compile IR to BPF object and add testcase Wang Nan
2016-11-26 17:25   ` Alexei Starovoitov
2016-11-28  6:32     ` Wangnan (F)
2016-11-28 10:31       ` Wangnan (F)
2016-11-28 19:33         ` Alexei Starovoitov
2016-12-06  8:26   ` [tip:perf/core] " tip-bot for Wang Nan
2016-11-26  7:03 ` [PATCH v3 15/30] perf clang: Compile BPF script use builtin clang support Wang Nan
2016-12-06  8:26   ` [tip:perf/core] perf clang: Compile BPF script using " tip-bot for Wang Nan
2016-11-26  7:03 ` [PATCH v3 16/30] perf clang: Pass full path to builtin clang Wang Nan
2016-11-26  7:03 ` [PATCH v3 17/30] perf clang: Pass CFLAGS " Wang Nan
2016-11-26  7:03 ` [PATCH v3 18/30] perf clang jit: Wrap llvm::Module using PerfModule Wang Nan
2016-11-26  7:03 ` [PATCH v3 19/30] perf clang jit: Insignt BPF and JIT functions in a Module Wang Nan
2016-11-26 17:32   ` Alexei Starovoitov
2016-11-26  7:03 ` [PATCH v3 20/30] perf clang jit: add PerfModule::doJIT to JIT perfhook functions Wang Nan
2016-11-26 17:29   ` Alexei Starovoitov
2016-11-28  6:42     ` Wangnan (F)
2016-11-26  7:03 ` [PATCH v3 21/30] perf clang jit: Export functions for jitted code Wang Nan
2016-11-26  7:03 ` [PATCH v3 22/30] perf clang jit: Actually JIT and hook in bpf loader Wang Nan
2016-11-26  7:03 ` [PATCH v3 23/30] perf clang jit: Collect the lowest address in maps section as map_base Wang Nan
2016-11-26  7:03 ` [PATCH v3 24/30] perf clang jit: Retrive fd of BPF map from its offset Wang Nan
2016-11-26  7:03 ` [PATCH v3 25/30] perf clang jit: Allow jitted perf hook access BPF maps Wang Nan
2016-11-26 17:09   ` Alexei Starovoitov
2016-11-26  7:03 ` [PATCH v3 26/30] perf clang: Link BPF functions declaration into perf Wang Nan
2016-11-26 17:40   ` Alexei Starovoitov
2016-11-30 16:12     ` Arnaldo Carvalho de Melo
2016-12-01  1:56       ` [PATCH v3 26/30 - cleanup] " Wang Nan
2016-11-26  7:03 ` [PATCH v3 27/30] perf clang: Declare BPF functions for BPF scripts automatically Wang Nan
2016-11-26  7:03 ` [PATCH v3 28/30] perf clang: Include helpers to BPF scripts Wang Nan
2016-11-26  7:03 ` [PATCH v3 29/30] perf clang builtin: Define hook helpers by default Wang Nan
2016-11-26  7:03 ` [PATCH v3 30/30] perf clang jit: Export getpid() to perf hook Wang Nan
2016-12-07  1:57 [PATCH v3 10/30] perf clang: Add builtin clang support ant test case Alexei Starovoitov
2017-01-17 18:27 Alexei Starovoitov
2017-01-17 19:04 ` Arnaldo Carvalho de Melo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).