1. 28 Apr, 2022 6 commits
    • Tiezhu Yang's avatar
    • Tiezhu Yang's avatar
      bpf, docs: BPF_FROM_BE exists as alias for BPF_TO_BE · c821d80b
      Tiezhu Yang authored
      According to include/uapi/linux/bpf.h:
      
        #define BPF_FROM_LE	BPF_TO_LE
        #define BPF_FROM_BE	BPF_TO_BE
      
      BPF_FROM_BE exists as alias for BPF_TO_BE instead of BPF_TO_LE.
      Signed-off-by: default avatarTiezhu Yang <yangtiezhu@loongson.cn>
      Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
      Link: https://lore.kernel.org/bpf/1651139754-4838-3-git-send-email-yangtiezhu@loongson.cn
      c821d80b
    • Tiezhu Yang's avatar
      67b97e58
    • Zhengchao Shao's avatar
      samples/bpf: Detach xdp prog when program exits unexpectedly in xdp_rxq_info_user · d1c57439
      Zhengchao Shao authored
      When xdp_rxq_info_user program exits unexpectedly, it doesn't detach xdp
      prog of device, and other xdp prog can't be attached to the device. So
      call init_exit() to detach xdp prog when program exits unexpectedly.
      Signed-off-by: default avatarZhengchao Shao <shaozhengchao@huawei.com>
      Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
      Link: https://lore.kernel.org/bpf/20220427062338.80173-1-shaozhengchao@huawei.com
      d1c57439
    • Mykola Lysenko's avatar
      bpf/selftests: Add granular subtest output for prog_test · 09252259
      Mykola Lysenko authored
      Implement per subtest log collection for both parallel
      and sequential test execution. This allows granular
      per-subtest error output in the 'All error logs' section.
      Add subtest log transfer into the protocol during the
      parallel test execution.
      
      Move all test log printing logic into dump_test_log
      function. One exception is the output of test names when
      verbose printing is enabled. Move test name/result
      printing into separate functions to avoid repetition.
      
      Print all successful subtest results in the log. Print
      only failed test logs when test does not have subtests.
      Or only failed subtests' logs when test has subtests.
      
      Disable 'All error logs' output when verbose mode is
      enabled. This functionality was already broken and is
      causing confusion.
      Signed-off-by: default avatarMykola Lysenko <mykolal@fb.com>
      Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
      Link: https://lore.kernel.org/bpf/20220427041353.246007-1-mykolal@fb.com
      09252259
    • Jakub Kicinski's avatar
      Merge https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next · 50c6afab
      Jakub Kicinski authored
      Daniel Borkmann says:
      
      ====================
      pull-request: bpf-next 2022-04-27
      
      We've added 85 non-merge commits during the last 18 day(s) which contain
      a total of 163 files changed, 4499 insertions(+), 1521 deletions(-).
      
      The main changes are:
      
      1) Teach libbpf to enhance BPF verifier log with human-readable and relevant
         information about failed CO-RE relocations, from Andrii Nakryiko.
      
      2) Add typed pointer support in BPF maps and enable it for unreferenced pointers
         (via probe read) and referenced ones that can be passed to in-kernel helpers,
         from Kumar Kartikeya Dwivedi.
      
      3) Improve xsk to break NAPI loop when rx queue gets full to allow for forward
         progress to consume descriptors, from Maciej Fijalkowski & Björn Töpel.
      
      4) Fix a small RCU read-side race in BPF_PROG_RUN routines which dereferenced
         the effective prog array before the rcu_read_lock, from Stanislav Fomichev.
      
      5) Implement BPF atomic operations for RV64 JIT, and add libbpf parsing logic
         for USDT arguments under riscv{32,64}, from Pu Lehui.
      
      6) Implement libbpf parsing of USDT arguments under aarch64, from Alan Maguire.
      
      7) Enable bpftool build for musl and remove nftw with FTW_ACTIONRETVAL usage
         so it can be shipped under Alpine which is musl-based, from Dominique Martinet.
      
      8) Clean up {sk,task,inode} local storage trace RCU handling as they do not
         need to use call_rcu_tasks_trace() barrier, from KP Singh.
      
      9) Improve libbpf API documentation and fix error return handling of various
         API functions, from Grant Seltzer.
      
      10) Enlarge offset check for bpf_skb_{load,store}_bytes() helpers given data
          length of frags + frag_list may surpass old offset limit, from Liu Jian.
      
      11) Various improvements to prog_tests in area of logging, test execution
          and by-name subtest selection, from Mykola Lysenko.
      
      12) Simplify map_btf_id generation for all map types by moving this process
          to build time with help of resolve_btfids infra, from Menglong Dong.
      
      13) Fix a libbpf bug in probing when falling back to legacy bpf_probe_read*()
          helpers; the probing caused always to use old helpers, from Runqing Yang.
      
      14) Add support for ARCompact and ARCv2 platforms for libbpf's PT_REGS
          tracing macros, from Vladimir Isaev.
      
      15) Cleanup BPF selftests to remove old & unneeded rlimit code given kernel
          switched to memcg-based memory accouting a while ago, from Yafang Shao.
      
      16) Refactor of BPF sysctl handlers to move them to BPF core, from Yan Zhu.
      
      17) Fix BPF selftests in two occasions to work around regressions caused by latest
          LLVM to unblock CI until their fixes are worked out, from Yonghong Song.
      
      18) Misc cleanups all over the place, from various others.
      
      * https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next: (85 commits)
        selftests/bpf: Add libbpf's log fixup logic selftests
        libbpf: Fix up verifier log for unguarded failed CO-RE relos
        libbpf: Simplify bpf_core_parse_spec() signature
        libbpf: Refactor CO-RE relo human description formatting routine
        libbpf: Record subprog-resolved CO-RE relocations unconditionally
        selftests/bpf: Add CO-RE relos and SEC("?...") to linked_funcs selftests
        libbpf: Avoid joining .BTF.ext data with BPF programs by section name
        libbpf: Fix logic for finding matching program for CO-RE relocation
        libbpf: Drop unhelpful "program too large" guess
        libbpf: Fix anonymous type check in CO-RE logic
        bpf: Compute map_btf_id during build time
        selftests/bpf: Add test for strict BTF type check
        selftests/bpf: Add verifier tests for kptr
        selftests/bpf: Add C tests for kptr
        libbpf: Add kptr type tag macros to bpf_helpers.h
        bpf: Make BTF type match stricter for release arguments
        bpf: Teach verifier about kptr_get kfunc helpers
        bpf: Wire up freeing of referenced kptr
        bpf: Populate pairs of btf_id and destructor kfunc in btf
        bpf: Adapt copy_map_value for multiple offset case
        ...
      ====================
      
      Link: https://lore.kernel.org/r/20220427224758.20976-1-daniel@iogearbox.netSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      50c6afab
  2. 27 Apr, 2022 28 commits
  3. 26 Apr, 2022 6 commits
    • Alexei Starovoitov's avatar
      Merge branch 'Teach libbpf to "fix up" BPF verifier log' · d54d06a4
      Alexei Starovoitov authored
      Andrii Nakryiko says:
      
      ====================
      
      This patch set teaches libbpf to enhance BPF verifier log with human-readable
      and relevant information about failed CO-RE relocation. Patch #9 is the main
      one with the new logic. See relevant commit messages for some more details.
      
      All the other patches are either fixing various bugs detected
      while working on this feature, most prominently a bug with libbpf not handling
      CO-RE relocations for SEC("?...") programs, or are refactoring libbpf
      internals to allow for easier reuse of CO-RE relo lookup and formatting logic.
      ====================
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      d54d06a4
    • Andrii Nakryiko's avatar
      selftests/bpf: Add libbpf's log fixup logic selftests · ea4128eb
      Andrii Nakryiko authored
      Add tests validating that libbpf is indeed patching up BPF verifier log
      with CO-RE relocation details. Also test partial and full truncation
      scenarios.
      
      This test might be a bit fragile due to changing BPF verifier log
      format. If that proves to be frequently breaking, we can simplify tests
      or remove the truncation subtests. But for now it seems useful to test
      it in those conditions that are otherwise rarely occuring in practice.
      
      Also test CO-RE relo failure in a subprog as that excercises subprogram CO-RE
      relocation mapping logic which doesn't work out of the box without extra
      relo storage previously done only for gen_loader case.
      Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Link: https://lore.kernel.org/bpf/20220426004511.2691730-11-andrii@kernel.org
      ea4128eb
    • Andrii Nakryiko's avatar
      libbpf: Fix up verifier log for unguarded failed CO-RE relos · 9fdc4273
      Andrii Nakryiko authored
      Teach libbpf to post-process BPF verifier log on BPF program load
      failure and detect known error patterns to provide user with more
      context.
      
      Currently there is one such common situation: an "unguarded" failed BPF
      CO-RE relocation. While failing CO-RE relocation is expected, it is
      expected to be property guarded in BPF code such that BPF verifier
      always eliminates BPF instructions corresponding to such failed CO-RE
      relos as dead code. In cases when user failed to take such precautions,
      BPF verifier provides the best log it can:
      
        123: (85) call unknown#195896080
        invalid func unknown#195896080
      
      Such incomprehensible log error is due to libbpf "poisoning" BPF
      instruction that corresponds to failed CO-RE relocation by replacing it
      with invalid `call 0xbad2310` instruction (195896080 == 0xbad2310 reads
      "bad relo" if you squint hard enough).
      
      Luckily, libbpf has all the necessary information to look up CO-RE
      relocation that failed and provide more human-readable description of
      what's going on:
      
        5: <invalid CO-RE relocation>
        failed to resolve CO-RE relocation <byte_off> [6] struct task_struct___bad.fake_field_subprog (0:2 @ offset 8)
      
      This hopefully makes it much easier to understand what's wrong with
      user's BPF program without googling magic constants.
      
      This BPF verifier log fixup is setup to be extensible and is going to be
      used for at least one other upcoming feature of libbpf in follow up patches.
      Libbpf is parsing lines of BPF verifier log starting from the very end.
      Currently it processes up to 10 lines of code looking for familiar
      patterns. This avoids wasting lots of CPU processing huge verifier logs
      (especially for log_level=2 verbosity level). Actual verification error
      should normally be found in last few lines, so this should work
      reliably.
      
      If libbpf needs to expand log beyond available log_buf_size, it
      truncates the end of the verifier log. Given verifier log normally ends
      with something like:
      
        processed 2 insns (limit 1000000) max_states_per_insn 0 total_states 0 peak_states 0 mark_read 0
      
      ... truncating this on program load error isn't too bad (end user can
      always increase log size, if it needs to get complete log).
      Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Link: https://lore.kernel.org/bpf/20220426004511.2691730-10-andrii@kernel.org
      9fdc4273
    • Andrii Nakryiko's avatar
      libbpf: Simplify bpf_core_parse_spec() signature · 14032f26
      Andrii Nakryiko authored
      Simplify bpf_core_parse_spec() signature to take struct bpf_core_relo as
      an input instead of requiring callers to decompose them into type_id,
      relo, spec_str, etc. This makes using and reusing this helper easier.
      Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Link: https://lore.kernel.org/bpf/20220426004511.2691730-9-andrii@kernel.org
      14032f26
    • Andrii Nakryiko's avatar
      libbpf: Refactor CO-RE relo human description formatting routine · b58af63a
      Andrii Nakryiko authored
      Refactor how CO-RE relocation is formatted. Now it dumps human-readable
      representation, currently used by libbpf in either debug or error
      message output during CO-RE relocation resolution process, into provided
      buffer. This approach allows for better reuse of this functionality
      outside of CO-RE relocation resolution, which we'll use in next patch
      for providing better error message for BPF verifier rejecting BPF
      program due to unguarded failed CO-RE relocation.
      
      It also gets rid of annoying "stitching" of libbpf_print() calls, which
      was the only place where we did this.
      Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Link: https://lore.kernel.org/bpf/20220426004511.2691730-8-andrii@kernel.org
      b58af63a
    • Andrii Nakryiko's avatar
      libbpf: Record subprog-resolved CO-RE relocations unconditionally · 185cfe83
      Andrii Nakryiko authored
      Previously, libbpf recorded CO-RE relocations with insns_idx resolved
      according to finalized subprog locations (which are appended at the end
      of entry BPF program) to simplify the job of light skeleton generator.
      
      This is necessary because once subprogs' instructions are appended to
      main entry BPF program all the subprog instruction indices are shifted
      and that shift is different for each entry (main) BPF program, so it's
      generally impossible to map final absolute insn_idx of the finalized BPF
      program to their original locations inside subprograms.
      
      This information is now going to be used not only during light skeleton
      generation, but also to map absolute instruction index to subprog's
      instruction and its corresponding CO-RE relocation. So start recording
      these relocations always, not just when obj->gen_loader is set.
      
      This information is going to be freed at the end of bpf_object__load()
      step, as before (but this can change in the future if there will be
      a need for this information post load step).
      Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Link: https://lore.kernel.org/bpf/20220426004511.2691730-7-andrii@kernel.org
      185cfe83