• Y
    selftests/bpf: Add a verifier scale test with unknown bounded loop · 86a35af6
    Yonghong Song 提交于
    The original bcc pull request https://github.com/iovisor/bcc/pull/3270 exposed
    a verifier failure with Clang 12/13 while Clang 4 works fine.
    
    Further investigation exposed two issues:
    
      Issue 1: LLVM may generate code which uses less refined value. The issue is
               fixed in LLVM patch: https://reviews.llvm.org/D97479
    
      Issue 2: Spills with initial value 0 are marked as precise which makes later
               state pruning less effective. This is my rough initial analysis and
               further investigation is needed to find how to improve verifier
               pruning in such cases.
    
    With the above LLVM patch, for the new loop6.c test, which has smaller loop
    bound compared to original test, I got:
    
      $ test_progs -s -n 10/16
      ...
      stack depth 64
      processed 390735 insns (limit 1000000) max_states_per_insn 87
          total_states 8658 peak_states 964 mark_read 6
      #10/16 loop6.o:OK
    
    Use the original loop bound, i.e., commenting out "#define WORKAROUND", I got:
    
      $ test_progs -s -n 10/16
      ...
      BPF program is too large. Processed 1000001 insn
      stack depth 64
      processed 1000001 insns (limit 1000000) max_states_per_insn 91
          total_states 23176 peak_states 5069 mark_read 6
      ...
      #10/16 loop6.o:FAIL
    
    The purpose of this patch is to provide a regression test for the above LLVM fix
    and also provide a test case for further analyzing the verifier pruning issue.
    Signed-off-by: NYonghong Song <yhs@fb.com>
    Signed-off-by: NDaniel Borkmann <daniel@iogearbox.net>
    Cc: Zhenwei Pi <pizhenwei@bytedance.com>
    Link: https://lore.kernel.org/bpf/20210226223810.236472-1-yhs@fb.com
    86a35af6
loop6.c 2.1 KB