mirror_ubuntu-kernels/tools/testing/selftests/bpf/progs
Yonghong Song b7a0d65d80 bpf, testing: Workaround a verifier failure for test_progs
With latest llvm compiler, running test_progs will have the following
verifier failure for test_sysctl_loop1.o:

  libbpf: load bpf program failed: Permission denied
  libbpf: -- BEGIN DUMP LOG ---
  libbpf:
  invalid indirect read from stack var_off (0x0; 0xff)+196 size 7
  ...
  libbpf: -- END LOG --
  libbpf: failed to load program 'cgroup/sysctl'
  libbpf: failed to load object 'test_sysctl_loop1.o'

The related bytecode looks as below:

  0000000000000308 LBB0_8:
      97:       r4 = r10
      98:       r4 += -288
      99:       r4 += r7
     100:       w8 &= 255
     101:       r1 = r10
     102:       r1 += -488
     103:       r1 += r8
     104:       r2 = 7
     105:       r3 = 0
     106:       call 106
     107:       w1 = w0
     108:       w1 += -1
     109:       if w1 > 6 goto -24 <LBB0_5>
     110:       w0 += w8
     111:       r7 += 8
     112:       w8 = w0
     113:       if r7 != 224 goto -17 <LBB0_8>

And source code:

     for (i = 0; i < ARRAY_SIZE(tcp_mem); ++i) {
             ret = bpf_strtoul(value + off, MAX_ULONG_STR_LEN, 0,
                               tcp_mem + i);
             if (ret <= 0 || ret > MAX_ULONG_STR_LEN)
                     return 0;
             off += ret & MAX_ULONG_STR_LEN;
     }

Current verifier is not able to conclude that register w0 before '+'
at insn 110 has a range of 1 to 7 and thinks it is from 0 - 255. This
leads to more conservative range for w8 at insn 112, and later verifier
complaint.

Let us workaround this issue until we found a compiler and/or verifier
solution. The workaround in this patch is to make variable 'ret' volatile,
which will force a reload and then '&' operation to ensure better value
range. With this patch, I got the below byte code for the loop:

  0000000000000328 LBB0_9:
     101:       r4 = r10
     102:       r4 += -288
     103:       r4 += r7
     104:       w8 &= 255
     105:       r1 = r10
     106:       r1 += -488
     107:       r1 += r8
     108:       r2 = 7
     109:       r3 = 0
     110:       call 106
     111:       *(u32 *)(r10 - 64) = r0
     112:       r1 = *(u32 *)(r10 - 64)
     113:       if w1 s< 1 goto -28 <LBB0_5>
     114:       r1 = *(u32 *)(r10 - 64)
     115:       if w1 s> 7 goto -30 <LBB0_5>
     116:       r1 = *(u32 *)(r10 - 64)
     117:       w1 &= 7
     118:       w1 += w8
     119:       r7 += 8
     120:       w8 = w1
     121:       if r7 != 224 goto -21 <LBB0_9>

Insn 117 did the '&' operation and we got more precise value range
for 'w8' at insn 120. The test is happy then:

  #3/17 test_sysctl_loop1.o:OK

Signed-off-by: Yonghong Song <yhs@fb.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Song Liu <songliubraving@fb.com>
Link: https://lore.kernel.org/bpf/20191107170045.2503480-1-yhs@fb.com
2019-11-11 14:03:10 +01:00
..
bpf_flow.c selftests/bpf: fix race in flow dissector tests 2019-08-13 16:31:10 +02:00
btf__core_reloc_arrays___diff_arr_dim.c selftests/bpf: add CO-RE relocs array tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_arrays___diff_arr_val_sz.c selftests/bpf: add CO-RE relocs array tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_arrays___err_non_array.c selftests/bpf: add CO-RE relocs array tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_arrays___err_too_shallow.c selftests/bpf: add CO-RE relocs array tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_arrays___err_too_small.c selftests/bpf: add CO-RE relocs array tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_arrays___err_wrong_val_type.c selftests/bpf: Remove too strict field offset relo test cases 2019-11-04 16:06:56 +01:00
btf__core_reloc_arrays.c selftests/bpf: add CO-RE relocs array tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_bitfields___bit_sz_change.c selftest/bpf: Add relocatable bitfield reading tests 2019-11-04 16:06:56 +01:00
btf__core_reloc_bitfields___bitfield_vs_int.c selftest/bpf: Add relocatable bitfield reading tests 2019-11-04 16:06:56 +01:00
btf__core_reloc_bitfields___err_too_big_bitfield.c selftest/bpf: Add relocatable bitfield reading tests 2019-11-04 16:06:56 +01:00
btf__core_reloc_bitfields___just_big_enough.c selftest/bpf: Add relocatable bitfield reading tests 2019-11-04 16:06:56 +01:00
btf__core_reloc_bitfields.c selftest/bpf: Add relocatable bitfield reading tests 2019-11-04 16:06:56 +01:00
btf__core_reloc_existence___err_wrong_arr_kind.c selftests/bpf: Add field existence CO-RE relocs tests 2019-10-15 16:06:05 -07:00
btf__core_reloc_existence___err_wrong_arr_value_type.c selftests/bpf: Add field existence CO-RE relocs tests 2019-10-15 16:06:05 -07:00
btf__core_reloc_existence___err_wrong_int_kind.c selftests/bpf: Add field existence CO-RE relocs tests 2019-10-15 16:06:05 -07:00
btf__core_reloc_existence___err_wrong_int_sz.c selftests/bpf: Add field existence CO-RE relocs tests 2019-10-15 16:06:05 -07:00
btf__core_reloc_existence___err_wrong_int_type.c selftests/bpf: Add field existence CO-RE relocs tests 2019-10-15 16:06:05 -07:00
btf__core_reloc_existence___err_wrong_struct_type.c selftests/bpf: Add field existence CO-RE relocs tests 2019-10-15 16:06:05 -07:00
btf__core_reloc_existence___minimal.c selftests/bpf: Add field existence CO-RE relocs tests 2019-10-15 16:06:05 -07:00
btf__core_reloc_existence.c selftests/bpf: Add field existence CO-RE relocs tests 2019-10-15 16:06:05 -07:00
btf__core_reloc_flavors__err_wrong_name.c selftests/bpf: add CO-RE relocs struct flavors tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_flavors.c selftests/bpf: add CO-RE relocs struct flavors tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_ints___bool.c selftests/bpf: add CO-RE relocs ints tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_ints___reverse_sign.c selftests/bpf: add CO-RE relocs ints tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_ints.c selftests/bpf: add CO-RE relocs ints tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_misc.c selftests/bpf: add CO-RE relocs misc tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_mods___mod_swap.c selftests/bpf: add CO-RE relocs modifiers/typedef tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_mods___typedefs.c selftests/bpf: add CO-RE relocs modifiers/typedef tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_mods.c selftests/bpf: add CO-RE relocs modifiers/typedef tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_nesting___anon_embed.c selftests/bpf: add CO-RE relocs nesting tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_nesting___dup_compat_types.c selftests/bpf: add CO-RE relocs nesting tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_nesting___err_array_container.c selftests/bpf: add CO-RE relocs nesting tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_nesting___err_array_field.c selftests/bpf: add CO-RE relocs nesting tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_nesting___err_dup_incompat_types.c selftests/bpf: add CO-RE relocs nesting tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_nesting___err_missing_container.c selftests/bpf: add CO-RE relocs nesting tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_nesting___err_missing_field.c selftests/bpf: add CO-RE relocs nesting tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_nesting___err_nonstruct_container.c selftests/bpf: add CO-RE relocs nesting tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_nesting___err_partial_match_dups.c selftests/bpf: add CO-RE relocs nesting tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_nesting___err_too_deep.c selftests/bpf: add CO-RE relocs nesting tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_nesting___extra_nesting.c selftests/bpf: add CO-RE relocs nesting tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_nesting___struct_union_mixup.c selftests/bpf: add CO-RE relocs nesting tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_nesting.c selftests/bpf: add CO-RE relocs nesting tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_primitives___diff_enum_def.c selftests/bpf: add CO-RE relocs enum/ptr/func_proto tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_primitives___diff_func_proto.c selftests/bpf: add CO-RE relocs enum/ptr/func_proto tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_primitives___diff_ptr_type.c selftests/bpf: add CO-RE relocs enum/ptr/func_proto tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_primitives___err_non_enum.c selftests/bpf: add CO-RE relocs enum/ptr/func_proto tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_primitives___err_non_int.c selftests/bpf: add CO-RE relocs enum/ptr/func_proto tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_primitives___err_non_ptr.c selftests/bpf: add CO-RE relocs enum/ptr/func_proto tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_primitives.c selftests/bpf: add CO-RE relocs enum/ptr/func_proto tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_ptr_as_arr___diff_sz.c selftests/bpf: add CO-RE relocs ptr-as-array tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_ptr_as_arr.c selftests/bpf: add CO-RE relocs ptr-as-array tests 2019-08-07 14:43:49 -07:00
btf__core_reloc_size___diff_sz.c selftests/bpf: Add field size relocation tests 2019-11-04 16:06:56 +01:00
btf__core_reloc_size.c selftests/bpf: Add field size relocation tests 2019-11-04 16:06:56 +01:00
btf_dump_test_case_bitfields.c selftests/bpf: add btf_dump BTF-to-C conversion tests 2019-05-24 14:05:58 -07:00
btf_dump_test_case_multidim.c selftests/bpf: add btf_dump BTF-to-C conversion tests 2019-05-24 14:05:58 -07:00
btf_dump_test_case_namespacing.c selftests/bpf: add btf_dump BTF-to-C conversion tests 2019-05-24 14:05:58 -07:00
btf_dump_test_case_ordering.c selftests/bpf: add btf_dump BTF-to-C conversion tests 2019-05-24 14:05:58 -07:00
btf_dump_test_case_packing.c selftests/bpf: add btf_dump BTF-to-C conversion tests 2019-05-24 14:05:58 -07:00
btf_dump_test_case_padding.c selftests/bpf: Fix btf_dump padding test case 2019-10-09 15:38:36 -07:00
btf_dump_test_case_syntax.c selftests/bpf: add btf_dump BTF-to-C conversion tests 2019-05-24 14:05:58 -07:00
connect4_prog.c
connect6_prog.c
core_reloc_types.h selftests/bpf: Add field size relocation tests 2019-11-04 16:06:56 +01:00
dev_cgroup.c
get_cgroup_id_kern.c selftests/bpf: convert legacy BPF maps to BTF-defined ones 2019-07-05 22:52:25 +02:00
kfree_skb.c bpf: Add cb access in kfree_skb test 2019-11-07 10:59:08 -08:00
loop1.c selftests/bpf: Split off tracing-only helpers into bpf_tracing.h 2019-10-08 23:16:03 +02:00
loop2.c selftests/bpf: Split off tracing-only helpers into bpf_tracing.h 2019-10-08 23:16:03 +02:00
loop3.c selftests/bpf: Split off tracing-only helpers into bpf_tracing.h 2019-10-08 23:16:03 +02:00
loop4.c selftests/bpf: add loop test 4 2019-08-06 08:20:25 -07:00
loop5.c selftests/bpf: add loop test 5 2019-08-06 08:20:31 -07:00
netcnt_prog.c selftests/bpf: convert selftests using BTF-defined maps to new syntax 2019-07-05 22:52:25 +02:00
pyperf50.c selftests/bpf: add pyperf scale test 2019-05-23 16:20:57 +02:00
pyperf100.c selftests/bpf: add pyperf scale test 2019-05-23 16:20:57 +02:00
pyperf180.c selftests/bpf: add pyperf scale test 2019-05-23 16:20:57 +02:00
pyperf600_nounroll.c selftests/bpf: add realistic loop tests 2019-06-19 02:22:52 +02:00
pyperf600.c selftests/bpf: add realistic loop tests 2019-06-19 02:22:52 +02:00
pyperf.h bpf, testing: Convert prog tests to probe_read_{user, kernel}{, _str} helper 2019-11-02 12:39:13 -07:00
sample_map_ret0.c
sample_ret0.c
sendmsg4_prog.c
sendmsg6_prog.c selftests/bpf: fix sendmsg6_prog on s390 2019-07-22 16:19:06 +02:00
socket_cookie_prog.c selftests/bpf: convert selftests using BTF-defined maps to new syntax 2019-07-05 22:52:25 +02:00
sockmap_parse_prog.c selftests/bpf: remove bpf_util.h from BPF C progs 2019-06-11 10:36:02 +02:00
sockmap_tcp_msg_prog.c selftests/bpf: remove bpf_util.h from BPF C progs 2019-06-11 10:36:02 +02:00
sockmap_verdict_prog.c selftests/bpf: convert legacy BPF maps to BTF-defined ones 2019-07-05 22:52:25 +02:00
sockopt_inherit.c selftests/bpf: add sockopt clone/inheritance test 2019-08-17 23:18:54 +02:00
sockopt_multi.c selftests/bpf: add sockopt test that exercises BPF_F_ALLOW_MULTI 2019-06-27 15:25:17 -07:00
sockopt_sk.c selftests/bpf: samples/bpf: Split off legacy stuff from bpf_helpers.h 2019-10-08 23:16:03 +02:00
strobemeta_nounroll1.c selftests/bpf: add realistic loop tests 2019-06-19 02:22:52 +02:00
strobemeta_nounroll2.c selftests/bpf: add realistic loop tests 2019-06-19 02:22:52 +02:00
strobemeta.c selftests/bpf: add realistic loop tests 2019-06-19 02:22:52 +02:00
strobemeta.h bpf, testing: Convert prog tests to probe_read_{user, kernel}{, _str} helper 2019-11-02 12:39:13 -07:00
tcp_rtt.c selftests/bpf: samples/bpf: Split off legacy stuff from bpf_helpers.h 2019-10-08 23:16:03 +02:00
test_adjust_tail.c
test_attach_probe.c libbpf: stop enforcing kern_version, populate it for users 2019-10-05 18:09:47 -07:00
test_btf_haskv.c selftests/bpf: samples/bpf: Split off legacy stuff from bpf_helpers.h 2019-10-08 23:16:03 +02:00
test_btf_newkv.c selftests/bpf: samples/bpf: Split off legacy stuff from bpf_helpers.h 2019-10-08 23:16:03 +02:00
test_btf_nokv.c
test_core_reloc_arrays.c libbpf: Add BPF_CORE_READ/BPF_CORE_READ_INTO helpers 2019-10-08 23:16:03 +02:00
test_core_reloc_bitfields_direct.c selftest/bpf: Add relocatable bitfield reading tests 2019-11-04 16:06:56 +01:00
test_core_reloc_bitfields_probed.c libbpf: Simplify BPF_CORE_READ_BITFIELD_PROBED usage 2019-11-06 13:54:59 -08:00
test_core_reloc_existence.c selftests/bpf: Add field existence CO-RE relocs tests 2019-10-15 16:06:05 -07:00
test_core_reloc_flavors.c libbpf: Add BPF_CORE_READ/BPF_CORE_READ_INTO helpers 2019-10-08 23:16:03 +02:00
test_core_reloc_ints.c libbpf: Add BPF_CORE_READ/BPF_CORE_READ_INTO helpers 2019-10-08 23:16:03 +02:00
test_core_reloc_kernel.c selftests/bpf: Make CO-RE reloc test impartial to test_progs flavor 2019-10-17 12:15:08 -07:00
test_core_reloc_misc.c libbpf: Add BPF_CORE_READ/BPF_CORE_READ_INTO helpers 2019-10-08 23:16:03 +02:00
test_core_reloc_mods.c libbpf: Add BPF_CORE_READ/BPF_CORE_READ_INTO helpers 2019-10-08 23:16:03 +02:00
test_core_reloc_nesting.c libbpf: Add BPF_CORE_READ/BPF_CORE_READ_INTO helpers 2019-10-08 23:16:03 +02:00
test_core_reloc_primitives.c libbpf: Add BPF_CORE_READ/BPF_CORE_READ_INTO helpers 2019-10-08 23:16:03 +02:00
test_core_reloc_ptr_as_arr.c libbpf: Add BPF_CORE_READ/BPF_CORE_READ_INTO helpers 2019-10-08 23:16:03 +02:00
test_core_reloc_size.c selftests/bpf: Add field size relocation tests 2019-11-04 16:06:56 +01:00
test_get_stack_rawtp.c libbpf: stop enforcing kern_version, populate it for users 2019-10-05 18:09:47 -07:00
test_global_data.c selftests/bpf: convert selftests using BTF-defined maps to new syntax 2019-07-05 22:52:25 +02:00
test_jhash.h selftests: bpf: standardize to static __always_inline 2019-07-03 15:06:33 +02:00
test_l4lb_noinline.c selftests/bpf: convert selftests using BTF-defined maps to new syntax 2019-07-05 22:52:25 +02:00
test_l4lb.c selftests/bpf: convert selftests using BTF-defined maps to new syntax 2019-07-05 22:52:25 +02:00
test_lirc_mode2_kern.c
test_lwt_ip_encap.c
test_lwt_seg6local.c selftests/bpf: introduce bpf_cpu_to_be64 and bpf_be64_to_cpu 2019-09-03 21:01:52 +02:00
test_map_in_map.c selftests/bpf: convert legacy BPF maps to BTF-defined ones 2019-07-05 22:52:25 +02:00
test_map_lock.c selftests/bpf: convert selftests using BTF-defined maps to new syntax 2019-07-05 22:52:25 +02:00
test_obj_id.c selftests/bpf: convert legacy BPF maps to BTF-defined ones 2019-07-05 22:52:25 +02:00
test_perf_buffer.c libbpf: stop enforcing kern_version, populate it for users 2019-10-05 18:09:47 -07:00
test_pinning_invalid.c selftests: Add tests for automatic map pinning 2019-11-02 12:35:07 -07:00
test_pinning.c selftests/bpf: Add tests for automatic map unpinning on load failure 2019-11-10 19:26:30 -08:00
test_pkt_access.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 206 2019-05-30 11:29:53 -07:00
test_pkt_md_access.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 206 2019-05-30 11:29:53 -07:00
test_probe_user.c bpf, testing: Add selftest to read/write sockaddr from user space 2019-11-02 12:45:08 -07:00
test_queue_map.c
test_queue_stack_map.h selftests/bpf: Move test_queue_stack_map.h into progs/ where it belongs 2019-10-17 12:15:08 -07:00
test_rdonly_maps.c selftests/bpf: Add read-only map values propagation tests 2019-10-11 01:49:15 +02:00
test_seg6_loop.c selftests/bpf: introduce bpf_cpu_to_be64 and bpf_be64_to_cpu 2019-09-03 21:01:52 +02:00
test_select_reuseport_kern.c selftests/bpf: convert selftests using BTF-defined maps to new syntax 2019-07-05 22:52:25 +02:00
test_send_signal_kern.c selftests/bpf: convert selftests using BTF-defined maps to new syntax 2019-07-05 22:52:25 +02:00
test_sk_lookup_kern.c selftests/bpf: Make reference_tracking test use subtests 2019-10-21 14:49:12 +02:00
test_skb_cgroup_id_kern.c
test_skb_ctx.c selftests: bpf: Add selftest for __sk_buff tstamp 2019-10-15 16:24:26 -07:00
test_sock_fields_kern.c selftests/bpf: convert selftests using BTF-defined maps to new syntax 2019-07-05 22:52:25 +02:00
test_sockhash_kern.c
test_sockmap_kern.c
test_spin_lock.c selftests/bpf: convert selftests using BTF-defined maps to new syntax 2019-07-05 22:52:25 +02:00
test_stack_map.c
test_stacktrace_build_id.c selftests/bpf: use typedef'ed arrays as map values 2019-07-15 23:02:17 +02:00
test_stacktrace_map.c libbpf: stop enforcing kern_version, populate it for users 2019-10-05 18:09:47 -07:00
test_sysctl_loop1.c bpf, testing: Workaround a verifier failure for test_progs 2019-11-11 14:03:10 +01:00
test_sysctl_loop2.c selftests/bpf: add realistic loop tests 2019-06-19 02:22:52 +02:00
test_sysctl_prog.c selftests/bpf: remove bpf_util.h from BPF C progs 2019-06-11 10:36:02 +02:00
test_tc_edt.c selftests/bpf: add bpf-gcc support 2019-09-16 09:32:00 +02:00
test_tc_tunnel.c selftests/bpf: expand test_tc_tunnel with SIT encap 2019-04-24 01:32:26 +02:00
test_tcp_check_syncookie_kern.c selftests/bpf: add test for bpf_tcp_gen_syncookie 2019-07-30 21:03:05 -07:00
test_tcp_estats.c bpf, testing: Convert prog tests to probe_read_{user, kernel}{, _str} helper 2019-11-02 12:39:13 -07:00
test_tcpbpf_kern.c selftests/bpf: convert selftests using BTF-defined maps to new syntax 2019-07-05 22:52:25 +02:00
test_tcpnotify_kern.c selftests/bpf: convert selftests using BTF-defined maps to new syntax 2019-07-05 22:52:25 +02:00
test_tracepoint.c
test_tunnel_kern.c
test_verif_scale1.c selftests/bpf: add few verifier scale tests 2019-04-04 01:27:38 +02:00
test_verif_scale2.c selftests: bpf: standardize to static __always_inline 2019-07-03 15:06:33 +02:00
test_verif_scale3.c selftests/bpf: add few verifier scale tests 2019-04-04 01:27:38 +02:00
test_xdp_loop.c selftests/bpf: convert legacy BPF maps to BTF-defined ones 2019-07-05 22:52:25 +02:00
test_xdp_meta.c
test_xdp_noinline.c selftests/bpf: fix test_xdp_noinline on s390 2019-07-18 13:54:54 -07:00
test_xdp_redirect.c
test_xdp_vlan.c
test_xdp.c selftests/bpf: convert selftests using BTF-defined maps to new syntax 2019-07-05 22:52:25 +02:00
xdp_dummy.c
xdp_redirect_map.c selftests/bpf: convert legacy BPF maps to BTF-defined ones 2019-07-05 22:52:25 +02:00
xdp_tx.c selftests, bpf: Add test for veth native XDP 2019-06-24 18:18:30 -07:00
xdping_kern.c selftests/bpf: convert legacy BPF maps to BTF-defined ones 2019-07-05 22:52:25 +02:00