lkml.org 
[lkml]   [2016]   [Nov]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Subject[PATCH v3 00/30] perf clang: Builtin clang and perfhook support
    Date
    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

    \
     
     \ /
      Last update: 2016-11-26 08:12    [W:4.695 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site