mbox series

[bpf-next,v5,00/17] bpf: Support new insns from cpu v4

Message ID 20230728011143.3710005-1-yonghong.song@linux.dev (mailing list archive)
Headers show
Series bpf: Support new insns from cpu v4 | expand

Message

Yonghong Song July 28, 2023, 1:11 a.m. UTC
In previous discussion ([1]), it is agreed that we should introduce
cpu version 4 (llvm flag -mcpu=v4) which contains some instructions
which can simplify code, make code easier to understand, fix the
existing problem, or simply for feature completeness. More specifically,
the following new insns are proposed:
  . sign extended load
  . sign extended mov
  . bswap
  . signed div/mod
  . ja with 32-bit offset

This patch set added kernel support for insns proposed in [1] except
BPF_ST which already has full kernel support. Beside the above proposed
insns, LLVM will generate BPF_ST insn as well under -mcpu=v4.
The llvm patch ([2]) has been merged into llvm-project 'main' branch.

The patchset implements interpreter, jit and verifier support for these new
insns.

For this patch set, I tested cpu v2/v3/v4 and the selftests are all passed.
I also tested selftests introduced in this patch set with additional changes
beside normal jit testing (bpf_jit_enable = 1 and bpf_jit_harden = 0)
  - bpf_jit_enable = 0
  - bpf_jit_enable = 1 and bpf_jit_harden = 1
and both testing passed.

  [1] https://lore.kernel.org/bpf/4bfe98be-5333-1c7e-2f6d-42486c8ec039@meta.com/
  [2] https://reviews.llvm.org/D144829

Changelogs:
  v4 -> v5:
   . for v4, patch 8/17 missed in mailing list and patchwork, so resend.
   . rebase on top of master
  v3 -> v4:
   . some minor asm syntax adjustment based on llvm change.
   . add clang version and target arch guard for new tests
     so they can still compile with old llvm compilers.
   . some changes to the bpf doc.
  v2 -> v3:
   . add missed disasm change from v2.
   . handle signed load of ctx fields properly.
   . fix some interpreter sdiv/smod error when bpf_jit_enable = 0.
   . fix some verifier range bounding errors.
   . add more C tests.
  RFCv1 -> v2:
   . add more verifier supports for signed extend load and mov insns.
   . rename some insn names to be more consistent with intel practice.
   . add cpuv4 test runner for test progs.
   . add more unit and C tests.
   . add documentation.

Yonghong Song (17):
  bpf: Support new sign-extension load insns
  bpf: Support new sign-extension mov insns
  bpf: Handle sign-extenstin ctx member accesses
  bpf: Support new unconditional bswap instruction
  bpf: Support new signed div/mod instructions.
  bpf: Fix jit blinding with new sdiv/smov insns
  bpf: Support new 32bit offset jmp instruction
  bpf: Add kernel/bpftool asm support for new instructions
  selftests/bpf: Fix a test_verifier failure
  selftests/bpf: Add a cpuv4 test runner for cpu=v4 testing
  selftests/bpf: Add unit tests for new sign-extension load insns
  selftests/bpf: Add unit tests for new sign-extension mov insns
  selftests/bpf: Add unit tests for new bswap insns
  selftests/bpf: Add unit tests for new sdiv/smod insns
  selftests/bpf: Add unit tests for new gotol insn
  selftests/bpf: Test ldsx with more complex cases
  docs/bpf: Add documentation for new instructions

 Documentation/bpf/bpf_design_QA.rst           |   5 -
 .../bpf/standardization/instruction-set.rst   | 115 ++-
 arch/x86/net/bpf_jit_comp.c                   | 141 +++-
 include/linux/filter.h                        |  17 +-
 include/uapi/linux/bpf.h                      |   1 +
 kernel/bpf/core.c                             | 196 ++++-
 kernel/bpf/disasm.c                           |  57 +-
 kernel/bpf/verifier.c                         | 348 ++++++--
 tools/include/uapi/linux/bpf.h                |   1 +
 tools/testing/selftests/bpf/.gitignore        |   2 +
 tools/testing/selftests/bpf/Makefile          |  28 +-
 .../selftests/bpf/bpf_testmod/bpf_testmod.c   |   9 +-
 .../selftests/bpf/prog_tests/test_ldsx_insn.c | 139 ++++
 .../selftests/bpf/prog_tests/verifier.c       |  10 +
 .../selftests/bpf/progs/test_ldsx_insn.c      | 118 +++
 .../selftests/bpf/progs/verifier_bswap.c      |  59 ++
 .../selftests/bpf/progs/verifier_gotol.c      |  44 +
 .../selftests/bpf/progs/verifier_ldsx.c       | 131 +++
 .../selftests/bpf/progs/verifier_movsx.c      | 213 +++++
 .../selftests/bpf/progs/verifier_sdiv.c       | 781 ++++++++++++++++++
 .../selftests/bpf/verifier/basic_instr.c      |   6 +-
 21 files changed, 2251 insertions(+), 170 deletions(-)
 create mode 100644 tools/testing/selftests/bpf/prog_tests/test_ldsx_insn.c
 create mode 100644 tools/testing/selftests/bpf/progs/test_ldsx_insn.c
 create mode 100644 tools/testing/selftests/bpf/progs/verifier_bswap.c
 create mode 100644 tools/testing/selftests/bpf/progs/verifier_gotol.c
 create mode 100644 tools/testing/selftests/bpf/progs/verifier_ldsx.c
 create mode 100644 tools/testing/selftests/bpf/progs/verifier_movsx.c
 create mode 100644 tools/testing/selftests/bpf/progs/verifier_sdiv.c

Comments

patchwork-bot+netdevbpf@kernel.org July 28, 2023, 2:20 a.m. UTC | #1
Hello:

This series was applied to bpf/bpf-next.git (master)
by Alexei Starovoitov <ast@kernel.org>:

On Thu, 27 Jul 2023 18:11:43 -0700 you wrote:
> In previous discussion ([1]), it is agreed that we should introduce
> cpu version 4 (llvm flag -mcpu=v4) which contains some instructions
> which can simplify code, make code easier to understand, fix the
> existing problem, or simply for feature completeness. More specifically,
> the following new insns are proposed:
>   . sign extended load
>   . sign extended mov
>   . bswap
>   . signed div/mod
>   . ja with 32-bit offset
> 
> [...]

Here is the summary with links:
  - [bpf-next,v5,01/17] bpf: Support new sign-extension load insns
    https://git.kernel.org/bpf/bpf-next/c/1f9a1ea821ff
  - [bpf-next,v5,02/17] bpf: Support new sign-extension mov insns
    https://git.kernel.org/bpf/bpf-next/c/8100928c8814
  - [bpf-next,v5,03/17] bpf: Handle sign-extenstin ctx member accesses
    https://git.kernel.org/bpf/bpf-next/c/1f1e864b6555
  - [bpf-next,v5,04/17] bpf: Support new unconditional bswap instruction
    https://git.kernel.org/bpf/bpf-next/c/0845c3db7bf5
  - [bpf-next,v5,05/17] bpf: Support new signed div/mod instructions.
    https://git.kernel.org/bpf/bpf-next/c/ec0e2da95f72
  - [bpf-next,v5,06/17] bpf: Fix jit blinding with new sdiv/smov insns
    https://git.kernel.org/bpf/bpf-next/c/7058e3a31ee4
  - [bpf-next,v5,07/17] bpf: Support new 32bit offset jmp instruction
    https://git.kernel.org/bpf/bpf-next/c/4cd58e9af8b9
  - [bpf-next,v5,09/17] selftests/bpf: Fix a test_verifier failure
    https://git.kernel.org/bpf/bpf-next/c/86180493a2ef
  - [bpf-next,v5,10/17] selftests/bpf: Add a cpuv4 test runner for cpu=v4 testing
    https://git.kernel.org/bpf/bpf-next/c/a5d0c26a2784
  - [bpf-next,v5,11/17] selftests/bpf: Add unit tests for new sign-extension load insns
    https://git.kernel.org/bpf/bpf-next/c/147c8f4470ee
  - [bpf-next,v5,12/17] selftests/bpf: Add unit tests for new sign-extension mov insns
    https://git.kernel.org/bpf/bpf-next/c/f02ec3ff3f09
  - [bpf-next,v5,13/17] selftests/bpf: Add unit tests for new bswap insns
    https://git.kernel.org/bpf/bpf-next/c/79dbabc17540
  - [bpf-next,v5,14/17] selftests/bpf: Add unit tests for new sdiv/smod insns
    https://git.kernel.org/bpf/bpf-next/c/de1c26809ec3
  - [bpf-next,v5,15/17] selftests/bpf: Add unit tests for new gotol insn
    https://git.kernel.org/bpf/bpf-next/c/613dad498072
  - [bpf-next,v5,16/17] selftests/bpf: Test ldsx with more complex cases
    https://git.kernel.org/bpf/bpf-next/c/0c606571ae07
  - [bpf-next,v5,17/17] docs/bpf: Add documentation for new instructions
    https://git.kernel.org/bpf/bpf-next/c/245d4c40c09b

You are awesome, thank you!