From: Peilin Ye <yepeilin@google.com>
To: bpf@vger.kernel.org, linux-arm-kernel@lists.infradead.org
Cc: Peilin Ye <yepeilin@google.com>,
bpf@ietf.org, Xu Kuohai <xukuohai@huaweicloud.com>,
Eduard Zingerman <eddyz87@gmail.com>,
David Vernet <void@manifault.com>,
Alexei Starovoitov <ast@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Andrii Nakryiko <andrii@kernel.org>,
Martin KaFai Lau <martin.lau@linux.dev>,
Song Liu <song@kernel.org>,
Yonghong Song <yonghong.song@linux.dev>,
John Fastabend <john.fastabend@gmail.com>,
KP Singh <kpsingh@kernel.org>,
Stanislav Fomichev <sdf@fomichev.me>, Hao Luo <haoluo@google.com>,
Jiri Olsa <jolsa@kernel.org>, Jonathan Corbet <corbet@lwn.net>,
"Paul E. McKenney" <paulmck@kernel.org>,
Puranjay Mohan <puranjay@kernel.org>,
Ilya Leoshkevich <iii@linux.ibm.com>,
Heiko Carstens <hca@linux.ibm.com>,
Vasily Gorbik <gor@linux.ibm.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will@kernel.org>, Quentin Monnet <qmo@kernel.org>,
Mykola Lysenko <mykolal@fb.com>, Shuah Khan <shuah@kernel.org>,
Ihor Solodrai <ihor.solodrai@linux.dev>,
Yingchi Long <longyingchi24s@ict.ac.cn>,
Josh Don <joshdon@google.com>, Barret Rhoden <brho@google.com>,
Neel Natu <neelnatu@google.com>,
Benjamin Segall <bsegall@google.com>,
linux-kernel@vger.kernel.org
Subject: [PATCH bpf-next v2 0/9] Introduce load-acquire and store-release BPF instructions
Date: Fri, 7 Feb 2025 02:04:54 +0000 [thread overview]
Message-ID: <cover.1738888641.git.yepeilin@google.com> (raw)
Hi all!
This patchset adds kernel support for BPF load-acquire and store-release
instructions (for background, please see [1]), mainly including
core/verifier, arm64 JIT compiler, and Documentation/ changes. x86-64
and riscv64 are also planned to be supported. The corresponding LLVM
changes can be found at:
https://github.com/llvm/llvm-project/pull/108636
An atomic load/store is a BPF_STX | BPF_ATOMIC instruction, with the
lowest 8 bits of the 'imm' field in the following format:
+-+-+-+-+-+-+-+-+
| type | order |
+-+-+-+-+-+-+-+-+
o 'type' indicates ATOMIC_LOAD (0x1) or ATOMIC_STORE (0x2)
o 'order' is one of RELAXED (0x0), ACQUIRE (0x1), RELEASE (0x2),
ACQ_REL (0x3, acquire-and-release) and SEQ_CST (0x4, sequentially
consistent)
Currently only two combinations are legal:
o LOAD_ACQ (0x11: ATOMIC_LOAD, ACQUIRE)
o STORE_REL (0x22: ATOMIC_STORE, RELEASE)
During v1 there was a discussion on whether it is necessary to have a
dedicated 'order' field and define all possible values, considering that
we only allow two combinations at the moment. Please refer to [2] for
more context.
v1: https://lore.kernel.org/all/cover.1737763916.git.yepeilin@google.com/
v1..v2 notable changes:
o (Eduard) for x86 and s390, make
bpf_jit_supports_insn(..., /*in_arena=*/true) return false
for load_acq/store_rel
o add Eduard's Acked-by: tag
o (Eduard) extract LDX and non-ATOMIC STX handling into helpers, see
PATCH v2 3/9
o allow unpriv programs to store-release pointers to stack
o (Alexei) make it clearer in the interpreter code (PATCH v2 4/9) that
only W and DW are supported for atomic RMW
o test misaligned load_acq/store_rel
o (Eduard) other selftests/ changes:
* test load_acq/store_rel with !atomic_ptr_type_ok() pointers:
- PTR_TO_CTX, for is_ctx_reg()
- PTR_TO_PACKET, for is_pkt_reg()
- PTR_TO_FLOW_KEYS, for is_flow_key_reg()
- PTR_TO_SOCKET, for is_sk_reg()
* drop atomics/ tests
* delete unnecessary 'pid' checks from arena_atomics/ tests
* avoid depending on __BPF_FEATURE_LOAD_ACQ_STORE_REL, use
__imm_insn() and inline asm macros instead
RFC v1: https://lore.kernel.org/all/cover.1734742802.git.yepeilin@google.com
RFC v1..v1 notable changes:
o 1-2/8: minor verifier.c refactoring patches
o 3/8: core/verifier changes
* (Eduard) handle load-acquire properly in backtrack_insn()
* (Eduard) avoid skipping checks (e.g.,
bpf_jit_supports_insn()) for load-acquires
* track the value stored by store-releases, just like how
non-atomic STX instructions are handled
* (Eduard) add missing link in commit message
* (Eduard) always print 'r' for disasm.c changes
o 4/8: arm64/insn: avoid treating load_acq/store_rel as
load_ex/store_ex
o 5/8: arm64/insn: add load_acq/store_rel
* (Xu) include Should-Be-One (SBO) bits in "mask" and "value",
to avoid setting fixed bits during runtime (JIT-compile
time)
o 6/8: arm64 JIT compiler changes
* (Xu) use emit_a64_add_i() for "pointer + offset" to optimize
code emission
o 7/8: selftests
* (Eduard) avoid adding new tests to the 'test_verifier' runner
* add more tests, e.g., checking mark_precise logic
o 8/8: instruction-set.rst changes
Please see the individual kernel patches (and LLVM commits) for details.
The LLVM GitHub PR will be split into three (each containing a single
commit) soon. Feedback is much appreciated!
[1] https://lore.kernel.org/all/20240729183246.4110549-1-yepeilin@google.com/
[2] https://lore.kernel.org/bpf/Z5srM--fdH_JAgYT@google.com
Thanks,
Peilin Ye (9):
bpf/verifier: Factor out atomic_ptr_type_ok()
bpf/verifier: Factor out check_atomic_rmw()
bpf/verifier: Factor out check_load_mem() and check_store_reg()
bpf: Introduce load-acquire and store-release instructions
arm64: insn: Add BIT(23) to {load,store}_ex's mask
arm64: insn: Add load-acquire and store-release instructions
bpf, arm64: Support load-acquire and store-release instructions
selftests/bpf: Add selftests for load-acquire and store-release
instructions
bpf, docs: Update instruction-set.rst for load-acquire and
store-release instructions
.../bpf/standardization/instruction-set.rst | 114 ++++++--
arch/arm64/include/asm/insn.h | 12 +-
arch/arm64/lib/insn.c | 29 ++
arch/arm64/net/bpf_jit.h | 20 ++
arch/arm64/net/bpf_jit_comp.c | 87 +++++-
arch/s390/net/bpf_jit_comp.c | 14 +-
arch/x86/net/bpf_jit_comp.c | 4 +
include/linux/bpf.h | 11 +
include/linux/filter.h | 2 +
include/uapi/linux/bpf.h | 13 +
kernel/bpf/core.c | 63 ++++-
kernel/bpf/disasm.c | 12 +
kernel/bpf/verifier.c | 234 +++++++++++-----
tools/include/uapi/linux/bpf.h | 13 +
.../selftests/bpf/prog_tests/arena_atomics.c | 50 ++++
.../selftests/bpf/prog_tests/verifier.c | 4 +
.../selftests/bpf/progs/arena_atomics.c | 88 ++++++
.../bpf/progs/verifier_load_acquire.c | 190 +++++++++++++
.../selftests/bpf/progs/verifier_precision.c | 47 ++++
.../bpf/progs/verifier_store_release.c | 262 ++++++++++++++++++
20 files changed, 1164 insertions(+), 105 deletions(-)
create mode 100644 tools/testing/selftests/bpf/progs/verifier_load_acquire.c
create mode 100644 tools/testing/selftests/bpf/progs/verifier_store_release.c
--
2.48.1.502.g6dc24dfdaf-goog
next reply other threads:[~2025-02-07 2:05 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-07 2:04 Peilin Ye [this message]
2025-02-07 2:05 ` [PATCH bpf-next v2 1/9] bpf/verifier: Factor out atomic_ptr_type_ok() Peilin Ye
2025-02-07 2:05 ` [PATCH bpf-next v2 2/9] bpf/verifier: Factor out check_atomic_rmw() Peilin Ye
2025-02-07 2:05 ` [PATCH bpf-next v2 3/9] bpf/verifier: Factor out check_load_mem() and check_store_reg() Peilin Ye
2025-02-10 23:45 ` Eduard Zingerman
2025-02-07 2:05 ` [PATCH bpf-next v2 4/9] bpf: Introduce load-acquire and store-release instructions Peilin Ye
2025-02-07 11:28 ` Ilya Leoshkevich
2025-02-07 21:23 ` Peilin Ye
2025-02-08 21:30 ` Alexei Starovoitov
2025-02-09 2:21 ` Peilin Ye
2025-02-09 3:46 ` Alexei Starovoitov
2025-02-09 23:41 ` Peilin Ye
2025-02-10 22:51 ` Peilin Ye
2025-02-12 22:14 ` Peilin Ye
2025-02-13 5:55 ` Alexei Starovoitov
2025-02-13 11:41 ` Peilin Ye
2025-02-15 2:34 ` Peilin Ye
2025-02-15 3:04 ` Alexei Starovoitov
2025-02-15 6:17 ` Peilin Ye
2025-02-07 2:06 ` [PATCH bpf-next v2 5/9] arm64: insn: Add BIT(23) to {load,store}_ex's mask Peilin Ye
2025-02-07 2:06 ` [PATCH bpf-next v2 6/9] arm64: insn: Add load-acquire and store-release instructions Peilin Ye
2025-02-07 2:06 ` [PATCH bpf-next v2 7/9] bpf, arm64: Support " Peilin Ye
2025-02-07 2:06 ` [PATCH bpf-next v2 8/9] selftests/bpf: Add selftests for " Peilin Ye
2025-02-07 23:47 ` Peilin Ye
2025-02-08 0:20 ` Peilin Ye
2025-02-08 2:20 ` Peilin Ye
2025-02-11 0:20 ` Eduard Zingerman
2025-02-11 0:08 ` Eduard Zingerman
2025-02-11 19:09 ` Peilin Ye
2025-02-11 20:15 ` Eduard Zingerman
2025-02-11 20:51 ` Peilin Ye
2025-02-20 1:08 ` Peilin Ye
2025-02-20 1:21 ` Eduard Zingerman
2025-02-07 2:06 ` [PATCH bpf-next v2 9/9] bpf, docs: Update instruction-set.rst " Peilin Ye
2025-02-07 21:29 ` [PATCH bpf-next v2 0/9] Introduce load-acquire and store-release BPF instructions Peilin Ye
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=cover.1738888641.git.yepeilin@google.com \
--to=yepeilin@google.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@ietf.org \
--cc=bpf@vger.kernel.org \
--cc=brho@google.com \
--cc=bsegall@google.com \
--cc=catalin.marinas@arm.com \
--cc=corbet@lwn.net \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=gor@linux.ibm.com \
--cc=haoluo@google.com \
--cc=hca@linux.ibm.com \
--cc=ihor.solodrai@linux.dev \
--cc=iii@linux.ibm.com \
--cc=john.fastabend@gmail.com \
--cc=jolsa@kernel.org \
--cc=joshdon@google.com \
--cc=kpsingh@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=longyingchi24s@ict.ac.cn \
--cc=martin.lau@linux.dev \
--cc=mykolal@fb.com \
--cc=neelnatu@google.com \
--cc=paulmck@kernel.org \
--cc=puranjay@kernel.org \
--cc=qmo@kernel.org \
--cc=sdf@fomichev.me \
--cc=shuah@kernel.org \
--cc=song@kernel.org \
--cc=void@manifault.com \
--cc=will@kernel.org \
--cc=xukuohai@huaweicloud.com \
--cc=yonghong.song@linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.