linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH bpf-next v2 0/9] Introduce load-acquire and store-release BPF instructions
@ 2025-02-07  2:04 Peilin Ye
  2025-02-07  2:05 ` [PATCH bpf-next v2 1/9] bpf/verifier: Factor out atomic_ptr_type_ok() Peilin Ye
                   ` (9 more replies)
  0 siblings, 10 replies; 35+ messages in thread
From: Peilin Ye @ 2025-02-07  2:04 UTC (permalink / raw)
  To: bpf, linux-arm-kernel
  Cc: Peilin Ye, bpf, Xu Kuohai, Eduard Zingerman, David Vernet,
	Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
	Martin KaFai Lau, Song Liu, Yonghong Song, John Fastabend,
	KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa, Jonathan Corbet,
	Paul E. McKenney, Puranjay Mohan, Ilya Leoshkevich,
	Heiko Carstens, Vasily Gorbik, Catalin Marinas, Will Deacon,
	Quentin Monnet, Mykola Lysenko, Shuah Khan, Ihor Solodrai,
	Yingchi Long, Josh Don, Barret Rhoden, Neel Natu, Benjamin Segall,
	linux-kernel

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



^ permalink raw reply	[flat|nested] 35+ messages in thread

end of thread, other threads:[~2025-02-20  1:31 UTC | newest]

Thread overview: 35+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-07  2:04 [PATCH bpf-next v2 0/9] Introduce load-acquire and store-release BPF instructions Peilin Ye
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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).