| From: |
| Alexei Starovoitov <alexei.starovoitov-AT-gmail.com> |
| To: |
| davem-AT-davemloft.net |
| Subject: |
| [PATCH v3 bpf-next 00/13] bpf: CO-RE support in the kernel |
| Date: |
| Fri, 19 Nov 2021 19:32:42 -0800 |
| Message-ID: |
| <20211120033255.91214-1-alexei.starovoitov@gmail.com> |
| Cc: |
| daniel-AT-iogearbox.net, andrii-AT-kernel.org, bpf-AT-vger.kernel.org, kernel-team-AT-fb.com |
| Archive-link: |
| Article |
From: Alexei Starovoitov <ast@kernel.org>
v2->v3:
. addressed Andrii's feedback in every patch.
New field in union bpf_attr changed from "core_relo" to "core_relos".
. added one more test and checkpatch.pl-ed the set.
v1->v2:
. Refactor uapi to pass 'struct bpf_core_relo' from LLVM into libbpf and further
into the kernel instead of bpf_core_apply_relo() bpf helper. Because of this
change the CO-RE algorithm has an ability to log error and debug events through
the standard bpf verifer log mechanism which was not possible with helper
approach.
. #define RELO_CORE macro was removed and replaced with btf_member_bit_offset() patch.
This set introduces CO-RE support in the kernel.
There are several reasons to add such support:
1. It's a step toward signed BPF programs.
2. It allows golang like languages that struggle to adopt libbpf
to take advantage of CO-RE powers.
3. Currently the field accessed by 'ldx [R1 + 10]' insn is recognized
by the verifier purely based on +10 offset. If R1 points to a union
the verifier picks one of the fields at this offset.
With CO-RE the kernel can disambiguate the field access.
Alexei Starovoitov (13):
libbpf: Replace btf__type_by_id() with btf_type_by_id().
bpf: Rename btf_member accessors.
bpf: Prepare relo_core.c for kernel duty.
bpf: Define enum bpf_core_relo_kind as uapi.
bpf: Pass a set of bpf_core_relo-s to prog_load command.
bpf: Add bpf_core_add_cands() and wire it into
bpf_core_apply_relo_insn().
libbpf: Use CO-RE in the kernel in light skeleton.
libbpf: Support init of inner maps in light skeleton.
selftests/bpf: Add lskel version of kfunc test.
selftests/bpf: Improve inner_map test coverage.
selftests/bpf: Convert map_ptr_kern test to use light skeleton.
selftests/bpf: Additional test for CO-RE in the kernel.
selftest/bpf: Revert CO-RE removal in test_ksyms_weak.
include/linux/bpf.h | 11 +
include/linux/btf.h | 89 ++++++++-
include/uapi/linux/bpf.h | 78 +++++++-
kernel/bpf/Makefile | 4 +
kernel/bpf/bpf_struct_ops.c | 6 +-
kernel/bpf/btf.c | 188 +++++++++++++++++-
kernel/bpf/syscall.c | 2 +-
kernel/bpf/verifier.c | 77 +++++++
net/ipv4/bpf_tcp_ca.c | 6 +-
tools/include/uapi/linux/bpf.h | 78 +++++++-
tools/lib/bpf/bpf_gen_internal.h | 4 +
tools/lib/bpf/btf.c | 2 +-
tools/lib/bpf/gen_loader.c | 68 ++++++-
tools/lib/bpf/libbpf.c | 116 +++++++----
tools/lib/bpf/libbpf_internal.h | 2 +-
tools/lib/bpf/relo_core.c | 179 +++++++++++------
tools/lib/bpf/relo_core.h | 71 +------
tools/testing/selftests/bpf/Makefile | 5 +-
.../selftests/bpf/prog_tests/core_kern.c | 14 ++
.../selftests/bpf/prog_tests/kfunc_call.c | 24 +++
.../selftests/bpf/prog_tests/ksyms_btf.c | 4 +-
.../selftests/bpf/prog_tests/map_ptr.c | 16 +-
tools/testing/selftests/bpf/progs/core_kern.c | 60 ++++++
.../selftests/bpf/progs/map_ptr_kern.c | 16 +-
.../selftests/bpf/progs/test_ksyms_weak.c | 2 +-
25 files changed, 911 insertions(+), 211 deletions(-)
create mode 100644 tools/testing/selftests/bpf/prog_tests/core_kern.c
create mode 100644 tools/testing/selftests/bpf/progs/core_kern.c
--
2.30.2