06 Dec, 2016

1 commit

  • The following commits will use builtin clang to compile BPF scripts.

    llvm__get_kbuild_opts() and llvm__get_nr_cpus() are extracted to help
    building '-DKERNEL_VERSION_CODE' and '-D__NR_CPUS__' macros.

    Doing object dumping in bpf loader, so further builtin clang compiling
    needn't consider it.

    Signed-off-by: Wang Nan
    Cc: Alexei Starovoitov
    Cc: He Kuang
    Cc: Jiri Olsa
    Cc: Joe Stringer
    Cc: Zefan Li
    Cc: pi3orama@163.com
    Link: http://lkml.kernel.org/r/20161126070354.141764-7-wangnan0@huawei.com
    Signed-off-by: Arnaldo Carvalho de Melo

    Wang Nan
     

22 Jun, 2016

1 commit

  • Add a 'llvm.dump-obj' config option to enable perf dump BPF object files
    compiled by LLVM.

    This option is useful when using BPF objects in embedded platforms.
    LLVM compiler won't be deployed in these platforms, and currently we
    don't support dynamic compiling library.

    Before this patch users have to explicitly issue llvm commands to
    compile BPF scripts, and can't use helpers (like include path detection
    and default macros) in perf. With this option, user is allowed to use
    perf to compile their BPF objects then copy them into their embedded
    platforms.

    Committer notice:

    Testing it:

    # cat ~/.perfconfig
    [llvm]
    dump-obj = true
    #
    # ls -la filter.o
    ls: cannot access filter.o: No such file or directory
    # cat filter.c
    #include
    #define SEC(NAME) __attribute__((section(NAME), used))

    SEC("func=hrtimer_nanosleep rqtp->tv_nsec")
    int func(void *ctx, int err, long nsec)
    {
    return nsec > 1000;
    }
    char _license[] SEC("license") = "GPL";
    int _version SEC("version") = LINUX_VERSION_CODE;
    # trace -e nanosleep --event filter.c usleep 6
    LLVM: dumping filter.o
    0.007 ( 0.007 ms): usleep/13976 nanosleep(rqtp: 0x7ffc5847f640 ) ...
    0.007 ( ): perf_bpf_probe:func:(ffffffff811137d0) tv_nsec=6000)
    0.070 ( 0.070 ms): usleep/13976 ... [continued]: nanosleep()) = 0
    # ls -la filter.o
    -rw-r--r--. 1 root root 776 Jun 20 17:01 filter.o
    # readelf -SW filter.o
    There are 7 section headers, starting at offset 0x148:

    Section Headers:
    [Nr] Name Type Address Off Size ES Flg Lk Inf Al
    [ 0] NULL 0000000000000000 000000 000000 00 0 0 0
    [ 1] .strtab STRTAB 0000000000000000 0000e8 00005a 00 0 0 1
    [ 2] .text PROGBITS 0000000000000000 000040 000000 00 AX 0 0 4
    [ 3] func=hrtimer_nanosleep rqtp->tv_nsec PROGBITS 0000000000000000 000040 000028 00 AX 0 0 8
    [ 4] license PROGBITS 0000000000000000 000068 000004 00 WA 0 0 1
    [ 5] version PROGBITS 0000000000000000 00006c 000004 00 WA 0 0 4
    [ 6] .symtab SYMTAB 0000000000000000 000070 000078 18 1 2 8
    Key to Flags:
    W (write), A (alloc), X (execute), M (merge), S (strings)
    I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
    O (extra OS processing required) o (OS specific), p (processor specific)
    #

    Signed-off-by: Wang Nan
    Cc: Alexei Starovoitov
    Cc: Jiri Olsa
    Cc: pi3orama@163.com
    Link: http://lkml.kernel.org/r/1466064161-48553-2-git-send-email-wangnan0@huawei.com
    [ s/dumpping/dumping/g ]
    Signed-off-by: Arnaldo Carvalho de Melo

    Wang Nan
     

24 Mar, 2016

1 commit


07 Aug, 2015

3 commits

  • Previous patches introduce llvm__compile_bpf() to compile source file to
    eBPF object. This patch adds testcase to test it. It also tests libbpf
    by opening generated object after applying next patch which introduces
    HAVE_LIBBPF_SUPPORT option.

    Since llvm__compile_bpf() prints long messages which users who don't
    explicitly test llvm doesn't care, this patch set verbose to -1 to
    suppress all debug, warning and error message, and hint user use 'perf
    test -v' to see the full output.

    For the same reason, if clang is not found in PATH and there's no [llvm]
    section in .perfconfig, skip this test.

    Signed-off-by: Wang Nan
    Acked-by: Alexei Starovoitov
    Cc: Brendan Gregg
    Cc: Daniel Borkmann
    Cc: David Ahern
    Cc: He Kuang
    Cc: Jiri Olsa
    Cc: Kaixu Xia
    Cc: Masami Hiramatsu
    Cc: Namhyung Kim
    Cc: Peter Zijlstra
    Cc: Zefan Li
    Cc: pi3orama@163.com
    Link: http://lkml.kernel.org/n/1436445342-1402-17-git-send-email-wangnan0@huawei.com
    [ Add tools/lib/bpf/ to tools/perf/MANIFEST, so that the tarball targets build ]
    Signed-off-by: Arnaldo Carvalho de Melo

    Wang Nan
     
  • This is the core patch for supporting eBPF on-the-fly compiling, does
    the following work:

    1. Search clang compiler using search_program().

    2. Run command template defined in llvm-bpf-cmd-template option in
    [llvm] config section using read_from_pipe(). Patch of clang and
    source code path is injected into shell command using environment
    variable using force_set_env().

    Commiter notice:

    When building with DEBUG=1 we get a compiler error that gets fixed with
    the same approach described in commit b236512280fb:

    perf kmem: Fix compiler warning about may be accessing uninitialized variable

    The last argument to strtok_r doesn't need to be initialized, its
    just a placeholder to make this routine reentrant, but gcc doesn't know
    about that and complains, breaking the build, fix it by setting it to
    NULL.

    Signed-off-by: Wang Nan
    Acked-by: Alexei Starovoitov
    Cc: Brendan Gregg
    Cc: Daniel Borkmann
    Cc: David Ahern
    Cc: He Kuang
    Cc: Jiri Olsa
    Cc: Kaixu Xia
    Cc: Masami Hiramatsu
    Cc: Namhyung Kim
    Cc: Peter Zijlstra
    Cc: Zefan Li
    Cc: pi3orama@163.com
    Link: http://lkml.kernel.org/n/1436445342-1402-14-git-send-email-wangnan0@huawei.com
    Signed-off-by: Arnaldo Carvalho de Melo

    Wang Nan
     
  • This patch introduces [llvm] config section with 5 options. Following
    patches will use then to config llvm dynamica compiling.

    'llvm-utils.[ch]' is introduced in this patch for holding all
    llvm/clang related stuffs.

    Example:

    [llvm]
    # Path to clang. If omit, search it from $PATH.
    clang-path = "/path/to/clang"

    # Cmdline template. Following line shows its default value.
    # Environment variable is used to passing options.
    #
    # *NOTE*: -D__KERNEL__ MUST appears before $CLANG_OPTIONS,
    # so user have a chance to use -U__KERNEL__ in $CLANG_OPTIONS
    # to cancel it.
    clang-bpf-cmd-template = "$CLANG_EXEC -D__KERNEL__ $CLANG_OPTIONS \
    $KERNEL_INC_OPTIONS -Wno-unused-value \
    -Wno-pointer-sign -working-directory \
    $WORKING_DIR -c $CLANG_SOURCE -target \
    bpf -O2 -o -"

    # Options passed to clang, will be passed to cmdline by
    # $CLANG_OPTIONS.
    clang-opt = "-Wno-unused-value -Wno-pointer-sign"

    # kbuild directory. If not set, use /lib/modules/`uname -r`/build.
    # If set to "" deliberately, skip kernel header auto-detector.
    kbuild-dir = "/path/to/kernel/build"

    # Options passed to 'make' when detecting kernel header options.
    kbuild-opts = "ARCH=x86_64"

    Signed-off-by: Wang Nan
    Acked-by: Alexei Starovoitov
    Cc: Brendan Gregg
    Cc: Daniel Borkmann
    Cc: David Ahern
    Cc: He Kuang
    Cc: Jiri Olsa
    Cc: Kaixu Xia
    Cc: Masami Hiramatsu
    Cc: Namhyung Kim
    Cc: Peter Zijlstra
    Cc: Zefan Li
    Cc: pi3orama@163.com
    Link: http://lkml.kernel.org/r/1437477214-149684-1-git-send-email-wangnan0@huawei.com
    Signed-off-by: Arnaldo Carvalho de Melo

    Wang Nan