• Thomas Richter's avatar
    perf build: Fix installation directory for eBPF · 83868bf7
    Thomas Richter authored
    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: default avatarStefan Liebler <stli@linux.ibm.com>
    Suggested-by: default avatarArnaldo Carvalho de Melo <acme@kernel.org>
    Signed-off-by: default avatarThomas Richter <tmricht@linux.ibm.com>
    Reviewed-by: default avatarHendrik Brueckner <brueckner@linux.ibm.com>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
    Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
    Fixes: 1b16fffa ("perf llvm-utils: Add bpf include path to clang command line")
    Link: http://lkml.kernel.org/r/20180731073254.91090-1-tmricht@linux.ibm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    83868bf7
Makefile.config 29.3 KB