All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/7] Atomics for eBPF
@ 2020-11-23 17:31 Brendan Jackman
  2020-11-23 17:31 ` [PATCH 1/7] bpf: Factor out emission of ModR/M for *(reg + off) Brendan Jackman
                   ` (7 more replies)
  0 siblings, 8 replies; 29+ messages in thread
From: Brendan Jackman @ 2020-11-23 17:31 UTC (permalink / raw)
  To: bpf
  Cc: Alexei Starovoitov, Yonghong Song, Daniel Borkmann, KP Singh,
	Florent Revest, Brendan Jackman

Status of the patches
=====================

This patchset is currently incomplete: it oughtn't be released as-is,
because that would necessitate incrementing architecture
version number for a partial feature-set. However I've implemented
the parts that I think are most interesting/controversial, so I'd
like to get the review started.

The missing elements that I'm aware of are:

* Atomic subtract
* Atomic & and |
* Documentation updates

The prog_test that's added depends on Clang/LLVM features added by
Yonghong in https://reviews.llvm.org/D72184

This only includes a JIT implementation for x86_64 - I don't plan to
implement JIT support myself for other architectures.

Operations
==========

This patchset adds atomic operations to the eBPF instruction set. The
use-case that motivated this work was a trivial and efficient way to
generate globally-unique cookies in BPF progs, but I think it's
obvious that these features are pretty widely applicable.  The
instructions that are added here can be summarised with this list of
kernel operations:

* atomic[64]_[fetch_]add
* atomic[64]_[fetch_]sub (TODO)
* atomic[64]_[fetch_]and (TODO)
* atomic[64]_[fetch_]or  (TODO)
* atomic[64]_xchg
* atomic[64]_cmpxchg

The following are left out of scope for this effort:

* 16 and 8 bit operations
* Explicit memory barriers

Encoding
========

I originally planned to add new values for bpf_insn.opcode. This was
rather unpleasant: the opcode space has holes in it but no entire
instruction classes[1]. Yonghong Song had a better idea: use the
immediate field of the existing STX XADD instruction to encode the
operation. This works nicely, without breaking existing programs,
because the immediate field is currently reserved-must-be-zero, and
extra-nicely because BPF_ADD happens to be zero.

Note that this of course makes immediate-source atomic operations
impossible. It's hard to imagine a measurable speedup from such
instructions, and if it existed it would certainly not benefit x86,
which has no support for them.

The BPF_OP opcode fields are re-used in the immediate, and an
additional flag BPF_FETCH is used to mark instructions that should
fetch a pre-modification value from memory.

So, BPF_XADD is now called BPF_ATOMIC (the old name is kept to avoid
breaking userspace builds), and where we previously had .imm = 0, we
now have .imm = BPF_ADD (which is 0).

Operands
========

Reg-source eBPF instructions only have two operands, while these
atomic operations have up to four. To avoid needing to encode
additional operands, then:

- One of the input registers is re-used as an output register
  (e.g. atomic_fetch_add both reads from and writes to the source
  register).

- Where necessary (i.e. for cmpxchg) , R0 is "hard-coded" as one of
  the operands.

This approach also allows the new eBPF instructions to map directly
to single x86 instructions.

[1] Visualisation of eBPF opcode space:
    https://gist.github.com/bjackman/00fdad2d5dfff601c1918bc29b16e778

Brendan Jackman (7):
  bpf: Factor out emission of ModR/M for *(reg + off)
  bpf: x86: Factor out emission of REX byte
  bpf: Rename BPF_XADD and prepare to encode other atomics in .imm
  bpf: Move BPF_STX reserved field check into BPF_STX verifier code
  bpf: Add BPF_FETCH field / create atomic_fetch_add instruction
  bpf: Add instructions for atomic_cmpxchg and friends
  bpf: Add tests for new BPF atomic operations

 Documentation/networking/filter.rst           |  27 ++--
 arch/arm/net/bpf_jit_32.c                     |   7 +-
 arch/arm64/net/bpf_jit_comp.c                 |  16 +-
 arch/mips/net/ebpf_jit.c                      |  11 +-
 arch/powerpc/net/bpf_jit_comp64.c             |  25 ++-
 arch/riscv/net/bpf_jit_comp32.c               |  20 ++-
 arch/riscv/net/bpf_jit_comp64.c               |  16 +-
 arch/s390/net/bpf_jit_comp.c                  |  26 ++--
 arch/sparc/net/bpf_jit_comp_64.c              |  14 +-
 arch/x86/net/bpf_jit_comp.c                   | 131 ++++++++++------
 arch/x86/net/bpf_jit_comp32.c                 |   6 +-
 drivers/net/ethernet/netronome/nfp/bpf/jit.c  |  14 +-
 drivers/net/ethernet/netronome/nfp/bpf/main.h |   4 +-
 .../net/ethernet/netronome/nfp/bpf/verifier.c |  13 +-
 include/linux/filter.h                        |  47 +++++-
 include/uapi/linux/bpf.h                      |   9 +-
 kernel/bpf/core.c                             |  64 ++++++--
 kernel/bpf/disasm.c                           |  25 ++-
 kernel/bpf/verifier.c                         |  72 ++++++---
 lib/test_bpf.c                                |   2 +-
 samples/bpf/bpf_insn.h                        |   4 +-
 samples/bpf/sock_example.c                    |   3 +-
 samples/bpf/test_cgrp2_attach.c               |   6 +-
 tools/include/linux/filter.h                  |  47 +++++-
 tools/include/uapi/linux/bpf.h                |   9 +-
 tools/testing/selftests/bpf/Makefile          |   2 +-
 .../selftests/bpf/prog_tests/atomics_test.c   | 145 ++++++++++++++++++
 .../bpf/prog_tests/cgroup_attach_multi.c      |   6 +-
 .../selftests/bpf/progs/atomics_test.c        |  61 ++++++++
 .../selftests/bpf/verifier/atomic_cmpxchg.c   |  96 ++++++++++++
 .../selftests/bpf/verifier/atomic_fetch_add.c | 106 +++++++++++++
 .../selftests/bpf/verifier/atomic_xchg.c      | 113 ++++++++++++++
 tools/testing/selftests/bpf/verifier/ctx.c    |   6 +-
 .../testing/selftests/bpf/verifier/leak_ptr.c |   4 +-
 tools/testing/selftests/bpf/verifier/unpriv.c |   3 +-
 tools/testing/selftests/bpf/verifier/xadd.c   |   2 +-
 36 files changed, 1002 insertions(+), 160 deletions(-)
 create mode 100644 tools/testing/selftests/bpf/prog_tests/atomics_test.c
 create mode 100644 tools/testing/selftests/bpf/progs/atomics_test.c
 create mode 100644 tools/testing/selftests/bpf/verifier/atomic_cmpxchg.c
 create mode 100644 tools/testing/selftests/bpf/verifier/atomic_fetch_add.c
 create mode 100644 tools/testing/selftests/bpf/verifier/atomic_xchg.c

--
2.29.2.454.gaff20da3a2-goog


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

end of thread, other threads:[~2020-11-24 22:52 UTC | newest]

Thread overview: 29+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-23 17:31 [PATCH 0/7] Atomics for eBPF Brendan Jackman
2020-11-23 17:31 ` [PATCH 1/7] bpf: Factor out emission of ModR/M for *(reg + off) Brendan Jackman
2020-11-23 17:31 ` [PATCH 2/7] bpf: x86: Factor out emission of REX byte Brendan Jackman
2020-11-23 17:31 ` [PATCH 3/7] bpf: Rename BPF_XADD and prepare to encode other atomics in .imm Brendan Jackman
2020-11-23 23:54   ` Yonghong Song
2020-11-24 11:02     ` Brendan Jackman
2020-11-24 16:04       ` Yonghong Song
2020-11-24  3:28   ` kernel test robot
2020-11-24  3:28     ` kernel test robot
2020-11-24  6:50   ` Alexei Starovoitov
2020-11-24 11:21     ` Brendan Jackman
2020-11-24 22:43       ` Alexei Starovoitov
2020-11-23 17:31 ` [PATCH 4/7] bpf: Move BPF_STX reserved field check into BPF_STX verifier code Brendan Jackman
2020-11-23 17:32 ` [PATCH 5/7] bpf: Add BPF_FETCH field / create atomic_fetch_add instruction Brendan Jackman
2020-11-23 21:12   ` kernel test robot
2020-11-23 21:12     ` kernel test robot
2020-11-23 21:51   ` kernel test robot
2020-11-23 21:51     ` kernel test robot
2020-11-24  6:52   ` Alexei Starovoitov
2020-11-24 10:48     ` Brendan Jackman
2020-11-23 17:32 ` [PATCH 6/7] bpf: Add instructions for atomic_cmpxchg and friends Brendan Jackman
2020-11-23 19:29   ` Brendan Jackman
2020-11-24  6:40   ` Alexei Starovoitov
2020-11-24 10:55     ` Brendan Jackman
2020-11-24 22:51       ` Alexei Starovoitov
2020-11-23 17:32 ` [PATCH 7/7] bpf: Add tests for new BPF atomic operations Brendan Jackman
2020-11-24  0:26   ` Yonghong Song
2020-11-24 13:10     ` Brendan Jackman
2020-11-23 17:36 ` [PATCH 0/7] Atomics for eBPF Brendan Jackman

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.