selftests: bpf: fix inlines in test_lwt_seg6local
authorJiri Benc <jbenc@redhat.com>
Tue, 2 Jul 2019 17:40:31 +0000 (19:40 +0200)
committerDaniel Borkmann <daniel@iogearbox.net>
Wed, 3 Jul 2019 13:07:41 +0000 (15:07 +0200)
commit11aca65ec4db09527d3e9b6b41a0615b7da4386b
tree35be8b23ecc5eaf7eef8b79b0b9a63c2ad6acb97
parentac8786c72eba67dfc8ae751a75c586289a1b9b1b
selftests: bpf: fix inlines in test_lwt_seg6local

Selftests are reporting this failure in test_lwt_seg6local.sh:

+ ip netns exec ns2 ip -6 route add fb00::6 encap bpf in obj test_lwt_seg6local.o sec encap_srh dev veth2
Error fetching program/map!
Failed to parse eBPF program: Operation not permitted

The problem is __attribute__((always_inline)) alone is not enough to prevent
clang from inserting those functions in .text. In that case, .text is not
marked as relocateable.

See the output of objdump -h test_lwt_seg6local.o:

Idx Name          Size      VMA               LMA               File off  Algn
  0 .text         00003530  0000000000000000  0000000000000000  00000040  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, CODE

This causes the iproute bpf loader to fail in bpf_fetch_prog_sec:
bpf_has_call_data returns true but bpf_fetch_prog_relo fails as there's no
relocateable .text section in the file.

To fix this, convert to 'static __always_inline'.

v2: Use 'static __always_inline' instead of 'static inline
    __attribute__((always_inline))'

Fixes: c99a84eac026 ("selftests/bpf: test for seg6local End.BPF action")
Signed-off-by: Jiri Benc <jbenc@redhat.com>
Acked-by: Yonghong Song <yhs@fb.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
tools/testing/selftests/bpf/progs/test_lwt_seg6local.c