lkml.org 
[lkml]   [2018]   [Sep]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.18 091/158] perf build: Fix installation directory for eBPF
    Date
    4.18-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Thomas Richter <tmricht@linux.ibm.com>

    [ Upstream commit 83868bf71d2eb7700b37f1ea188007f0125e4ee4 ]

    The perf tool build and install is controlled via a Makefile. The
    'install' rule creates directories and copies files. Among them are
    header files installed in /usr/lib/include/perf/bpf/.

    However all listed examples are installing its header files in

    /usr/lib/<tool-name>/...[/include]/header.h

    and not in

    /usr/lib/include/<tool-name>/.../header.h.

    Background information:

    Building the Fedora 28 glibc RPM on s390x and s390 fails on s390 (gcc
    -m31) as gcc is not able to find header-files like stdbool.h.

    In the glibc.spec file, you can see that glibc is configured with
    "--with-headers". In this case, first -nostdinc is added to the CFLAGS
    and then further include paths are added via -isystem. One of those
    paths should contain header files like stdbool.h.

    In order to get this path, gcc is invoked with:

    - on Fedora 28 (with 4.18 kernel):

    $ gcc -print-file-name=include
    /usr/lib/gcc/s390x-redhat-linux/8/include
    $ gcc -m31 -print-file-name=include
    /usr/lib/gcc/s390x-redhat-linux/8/../../../../lib/include
    => If perf is installed, this is: /usr/lib/include
    On my machine this directory is only containing the directory "perf".
    If perf is not installed gcc returns: /usr/lib/gcc/s390x-redhat-linux/8/include

    - on Ubuntu 18.04 (with 4.15 kernel):

    $ gcc -print-file-name=include
    /usr/lib/gcc/s390x-linux-gnu/7/include
    $ gcc -m31 -print-file-name=include
    /usr/lib/gcc/s390x-linux-gnu/7/include
    => gcc returns the correct path even if perf is installed.

    In each case, the introduction of the subdirectory /usr/lib/include
    leads to the regression that one can not build the glibc RPM for s390
    anymore as gcc can not find headers like stdbool.h.

    To remedy this install bpf.h to /usr/lib/perf/include/bpf/bpf.h

    Output before using the command 'perf test -Fv 40':

    echo '...[bpf-program-source]...' | /usr/bin/clang ... \
    -I/root/lib/include/perf/bpf ...
    ^^^^^^^^^^^^
    ...
    [root@p23lp27 perf]# perf test -F 40
    40: BPF filter :
    40.1: Basic BPF filtering : Ok
    40.2: BPF pinning : Ok
    40.3: BPF prologue generation : Ok
    40.4: BPF relocation checker : Ok
    [root@p23lp27 perf]#

    Output after using command 'perf test -Fv 40':

    echo '...[bpf-program-source]...' | /usr/bin/clang ... \
    -I/root/lib/perf/include/bpf ...
    ^^^^^^^^^^^^
    ...
    [root@p23lp27 perf]# perf test -F 40
    40: BPF filter :
    40.1: Basic BPF filtering : Ok
    40.2: BPF pinning : Ok
    40.3: BPF prologue generation : Ok
    40.4: BPF relocation checker : Ok
    [root@p23lp27 perf]#

    Committer testing:

    While the above 'perf test -F 40' (or 'perf test bpf') will allow us
    to see that the correct path is now added via -I, to actually test this
    we better try to use a bpf script that includes files in the changed
    directory.

    We have the files that now reside in /root/lib/perf/examples/bpf/ to do
    just that:

    # tail -8 /root/lib/perf/examples/bpf/5sec.c
    #include <bpf.h>

    int probe(hrtimer_nanosleep, rqtp->tv_sec)(void *ctx, int err, long sec)
    {
    return sec == 5;
    }

    license(GPL);
    # perf trace -e *sleep -e /root/lib/perf/examples/bpf/5sec.c sleep 4
    0.333 (4000.086 ms): sleep/9248 nanosleep(rqtp: 0x7ffc155f3300) = 0
    # perf trace -e *sleep -e /root/lib/perf/examples/bpf/5sec.c sleep 5
    0.287 ( ): sleep/9659 nanosleep(rqtp: 0x7ffeafe38200) ...
    0.290 ( ): perf_bpf_probe:hrtimer_nanosleep:(ffffffff9911efe0) tv_sec=5
    0.287 (5000.059 ms): sleep/9659 ... [continued]: nanosleep()) = 0
    # perf trace -e *sleep -e /root/lib/perf/examples/bpf/5sec.c sleep 6
    0.247 (5999.951 ms): sleep/10068 nanosleep(rqtp: 0x7fff2086d900) = 0
    # perf trace -e *sleep -e /root/lib/perf/examples/bpf/5sec.c sleep 5.987
    0.293 ( ): sleep/10489 nanosleep(rqtp: 0x7ffdd4fc10e0) ...
    0.296 ( ): perf_bpf_probe:hrtimer_nanosleep:(ffffffff9911efe0) tv_sec=5
    0.293 (5986.912 ms): sleep/10489 ... [continued]: nanosleep()) = 0
    #

    Suggested-by: Stefan Liebler <stli@linux.ibm.com>
    Suggested-by: Arnaldo Carvalho de Melo <acme@kernel.org>
    Signed-off-by: Thomas Richter <tmricht@linux.ibm.com>
    Reviewed-by: Hendrik Brueckner <brueckner@linux.ibm.com>
    Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
    Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
    Fixes: 1b16fffa389d ("perf llvm-utils: Add bpf include path to clang command line")
    Link: http://lkml.kernel.org/r/20180731073254.91090-1-tmricht@linux.ibm.com
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    tools/perf/Makefile.config | 4 ++--
    1 file changed, 2 insertions(+), 2 deletions(-)

    --- a/tools/perf/Makefile.config
    +++ b/tools/perf/Makefile.config
    @@ -905,8 +905,8 @@ bindir = $(abspath $(prefix)/$(bindir_re
    mandir = share/man
    infodir = share/info
    perfexecdir = libexec/perf-core
    -perf_include_dir = lib/include/perf
    -perf_examples_dir = lib/examples/perf
    +perf_include_dir = lib/perf/include
    +perf_examples_dir = lib/perf/examples
    sharedir = $(prefix)/share
    template_dir = share/perf-core/templates
    STRACE_GROUPS_DIR = share/perf-core/strace/groups

    \
     
     \ /
      Last update: 2018-09-18 01:19    [W:4.265 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site