Skip to content
  • Arnaldo Carvalho de Melo's avatar
    perf llvm: Fix script used to obtain kernel make directives to work with new kbuild · 62765941
    Arnaldo Carvalho de Melo authored
    
    
    Before this patch:
    
      # ./perf test 39 41
      39: LLVM search and compile                               :
      39.1: Basic BPF llvm compile                              : Ok
      39.2: kbuild searching                                    : FAILED!
      39.3: Compile source for BPF prologue generation          : Skip
      39.4: Compile source for BPF relocation                   : Skip
      41: BPF filter                                            :
      41.1: Basic BPF filtering                                 : Ok
      41.2: BPF pinning                                         : Ok
      41.3: BPF prologue generation                             : FAILED!
      41.4: BPF relocation checker                              : Skip
      #
    
    Using 'perf test -v' for these tests shows that it is not finding
    uapi/linux/fs.h, which ends up being because we don't setup the right header
    path. Fix it.
    
    After this patch:
    
      # perf test 39 41
      39: LLVM search and compile                               :
      39.1: Basic BPF llvm compile                              : Ok
      39.2: kbuild searching                                    : Ok
      39.3: Compile source for BPF prologue generation          : Ok
      39.4: Compile source for BPF relocation                   : Ok
      41: BPF filter                                            :
      41.1: Basic BPF filtering                                 : Ok
      41.2: BPF pinning                                         : Ok
      41.3: BPF prologue generation                             : Ok
      41.4: BPF relocation checker                              : Ok
      #
    
    Longer description:
    
    In llvm-utils.c we use some techniques to obtain the kbuild make
    directives and that recently stopped working as now 'ar' gets called and
    expects to find the dummy.o used to echo these variables:
    
      $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(EXTRA_CFLAGS)
    
    Add the $(CC) line to satisfy that, making sure this works with all
    kernels, i.e. preserving the temp directory and files in it used for
    this technique we can see that it works everywhere:
    
      # make -s -C /lib/modules/5.4.18-100.fc30.x86_64/build M=/tmp/tmp.qgaFHgxjZ4/ clean
      # ls -la /tmp/tmp.qgaFHgxjZ4/
      total 4
      drwx------.  2 root root   80 Feb 14 09:42 .
      drwxrwxrwt. 47 root root 1200 Feb 14 09:42 ..
      -rw-r--r--.  1 root root    0 Feb 13 17:14 dummy.c
      -rw-r--r--.  1 root root  121 Feb 13 17:14 Makefile
      #
      # cat /tmp/tmp.qgaFHgxjZ4/Makefile
      obj-y := dummy.o
      $(obj)/%.o: $(src)/%.c
              @echo -n "$(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(EXTRA_CFLAGS)"
              $(CC) -c -o $@ $<
      #
    
    Then build with an old kernel Makefile:
    
      # make -s -C /lib/modules/5.4.18-100.fc30.x86_64/build M=/tmp/tmp.qgaFHgxjZ4/ dummy.o
      -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/9/include -I./arch/x86/include -I./arch/x86/include/generated  -I./include -I./arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I./include/uapi -I./include/generated/uapi -include ./include/linux/kconfig.h
      #
      # ls -la /tmp/tmp.qgaFHgxjZ4/
      total 8
      drwx------.  2 root root  100 Feb 14 09:43 .
      drwxrwxrwt. 47 root root 1200 Feb 14 09:43 ..
      -rw-r--r--.  1 root root    0 Feb 13 17:14 dummy.c
      -rw-r--r--.  1 root root  936 Feb 14 09:43 dummy.o
      -rw-r--r--.  1 root root  121 Feb 13 17:14 Makefile
      #
    
    And a new one:
    
      # make -s -C /lib/modules/5.4.18-100.fc30.x86_64/build M=/tmp/tmp.qgaFHgxjZ4/ clean
      # ls -la /tmp/tmp.qgaFHgxjZ4/
      total 4
      drwx------.  2 root root   80 Feb 14 09:43 .
      drwxrwxrwt. 47 root root 1200 Feb 14 09:43 ..
      -rw-r--r--.  1 root root    0 Feb 13 17:14 dummy.c
      -rw-r--r--.  1 root root  121 Feb 13 17:14 Makefile
      # make -s -C /lib/modules/5.6.0-rc1+/build M=/tmp/tmp.qgaFHgxjZ4/ dummy.o
       -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/9/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h
      #
      # ls -la /tmp/tmp.qgaFHgxjZ4/
      total 16
      drwx------.  2 root root  160 Feb 14 09:44 .
      drwxrwxrwt. 47 root root 1200 Feb 14 09:44 ..
      -rw-r--r--.  1 root root  158 Feb 14 09:44 built-in.a
      -rw-r--r--.  1 root root  149 Feb 14 09:44 .built-in.a.cmd
      -rw-r--r--.  1 root root    0 Feb 13 17:14 dummy.c
      -rw-r--r--.  1 root root  936 Feb 14 09:44 dummy.o
      -rw-r--r--.  1 root root  121 Feb 13 17:14 Makefile
      -rw-r--r--.  1 root root    0 Feb 14 09:44 modules.order
      #
    
    Reported-by: default avatarThomas Richter <tmricht@linux.ibm.com>
    Tested-by: default avatarThomas Richter <tmricht@linux.ibm.com>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Daniel Borkmann <daniel@iogearbox.net>
    Cc: He Kuang <hekuang@huawei.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Masahiro Yamada <masahiroy@kernel.org>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Sumanth Korikkar <sumanthk@linux.ibm.com>
    Cc: Vasily Gorbik <gor@linux.ibm.com>
    Cc: Wang Nan <wangnan0@huawei.com>
    Cc: Zefan Li <lizefan@huawei.com>
    Link: https://www.spinics.net/lists/linux-perf-users/msg10600.html
    
    
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    62765941