Re: [PATCH 1/2] perf test: Add libbpf relocation checker

From: Arnaldo Carvalho de Melo
Date: Fri Jan 22 2016 - 10:41:02 EST


Em Fri, Jan 22, 2016 at 09:27:20AM +0000, Wang Nan escreveu:
> There's a bug in LLVM that it can generate unneeded relocation
> information. See [1] and [2]. Libbpf should check the target section
> of a relocation symbol.
>
> This patch adds a testcase which reference a global variable (BPF
> doesn't support global variable). Before fixing libbpf, the new test
> case can be loaded into kernel, the global variable acts like the first
> map. It is incorrect.
>
> Result:
> # ~/perf test BPF
> 37: Test BPF filter :
> 37.1: Test basic BPF filtering : Ok
> 37.2: Test BPF prologue generation : Ok
> 37.3: Test BPF relocation checker : FAILED!

So I just got a new notebook, a t450s (heya, will be able to test Intel
PT, etc) and installed fedora 23 on it, cool, there is clang/llvm in it!
And furthermore:

[root@jouet ~]# clang --version
clang version 3.7.0 (tags/RELEASE_370/final)
Target: x86_64-redhat-linux-gnu
Thread model: posix
[root@jouet ~]#

Seems to be the one we need!

But...

[root@jouet ~]# perf test bpf
37: Test BPF filter :
37.1: Test basic BPF filtering : Skip
37.2: Test BPF prologue generation : Skip
[root@jouet ~]#

oh well...

>From 'perf test -v bpf':

' | $CLANG_EXEC -D__KERNEL__ -D__NR_CPUS__=$NR_CPUS -DLINUX_VERSION_CODE=$LINUX_VERSION_CODE $CLANG_OPTIONS $KERNEL_INC_OPTIONS -Wno-unused-value -Wno-pointer-sign -working-directory $WORKING_DIR -c "$CLANG_SOURCE" -target bpf -O2 -o -
error: unable to create target: 'No available targets are compatible with this triple, see -version for the available targets.'

----

And after googling 'list clang supported target'

[root@jouet ~]# llc --version
LLVM (http://llvm.org/):
LLVM version 3.7.0
Optimized build.
Built Dec 4 2015 (15:49:18).
Default target: x86_64-redhat-linux-gnu
Host CPU: broadwell

Registered Targets:
aarch64 - AArch64 (little endian)
aarch64_be - AArch64 (big endian)
amdgcn - AMD GCN GPUs
arm - ARM
arm64 - ARM64 (little endian)
armeb - ARM (big endian)
cpp - C++ backend
nvptx - NVIDIA PTX 32-bit
nvptx64 - NVIDIA PTX 64-bit
ppc32 - PowerPC 32
ppc64 - PowerPC 64
ppc64le - PowerPC 64 LE
r600 - AMD GPUs HD2XXX-HD6XXX
systemz - SystemZ
thumb - Thumb
thumbeb - Thumb (big endian)
x86 - 32-bit X86: Pentium-Pro and above
x86-64 - 64-bit X86: EM64T and AMD64
[root@jouet ~]#

Oops, no bpf, so the good thing is that if we uninstall clang and try that test again:

[root@jouet ~]# dnf remove clang llvm
Dependencies resolved.
==============================================================
Package Arch Version Repository Size
==============================================================
Removing:
clang x86_64 3.7.0-3.fc23 @updates 45 M
clang-libs x86_64 3.7.0-3.fc23 @updates 14 M
gcc-c++ x86_64 5.3.1-2.fc23 @updates 24 M
libstdc++-devel x86_64 5.3.1-2.fc23 @updates 9.5 M
llvm x86_64 3.7.0-3.fc23 @updates 4.9 M

Transaction Summary
==============================================================
Remove 5 Packages


When I try it again I get nice instructions on how to install it!

[root@jouet ~]# perf test bpf
37: Test BPF filter :
37.1: Test basic BPF filtering : Skip
37.2: Test BPF prologue generation : Skip
[root@jouet ~]# perf test -v bpf
37: Test BPF filter :
37.1: Test basic BPF filtering :
--- start ---
test child forked, pid 30062
ERROR: unable to find clang.
Hint: Try to install latest clang/llvm to support BPF. Check your $PATH
and 'clang-path' option in [llvm] section of ~/.perfconfig.
LLVM 3.7 or newer is required. Which can be found from http://llvm.org
You may want to try git trunk:
git clone http://llvm.org/git/llvm.git
and
git clone http://llvm.org/git/clang.git

Or fetch the latest clang/llvm 3.7 from pre-built llvm packages for
debian/ubuntu:
http://llvm.org/apt

If you are using old version of clang, change 'clang-bpf-cmd-template'
option in [llvm] section of ~/.perfconfig to:

"$CLANG_EXEC $CLANG_OPTIONS $KERNEL_INC_OPTIONS \
-working-directory $WORKING_DIR -c $CLANG_SOURCE \
-emit-llvm -o - | /path/to/llc -march=bpf -filetype=obj -o -"
(Replace /path/to/llc with path to your llc)

Failed to compile test case: 'Basic BPF llvm compiling test'
Unable to get BPF object, fix 'perf test LLVM' first
test child finished with -2
---- end ----
Test BPF filter subtest 0: Skip
37.2: Test BPF prologue generation :
--- force skipped ---
Test BPF filter subtest 1: Skip
[root@jouet ~]#

Lets try it...

- Arnaldo