Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752757AbcKZHMb (ORCPT ); Sat, 26 Nov 2016 02:12:31 -0500 Received: from szxga01-in.huawei.com ([58.251.152.64]:59869 "EHLO szxga01-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751539AbcKZHHJ (ORCPT ); Sat, 26 Nov 2016 02:07:09 -0500 From: Wang Nan To: , CC: , , , , , Wang Nan , Jiri Olsa Subject: [PATCH v3 00/30] perf clang: Builtin clang and perfhook support Date: Sat, 26 Nov 2016 07:03:24 +0000 Message-ID: <20161126070354.141764-1-wangnan0@huawei.com> X-Mailer: git-send-email 2.10.1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.107.193.248] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 7654 Lines: 195 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 Cc: Alexei Starovoitov Cc: He Kuang Cc: Jiri Olsa Cc: Joe Stringer Cc: Zefan Li Cc: pi3orama@163.com -- 2.10.1