Re: [PATCH bpf-next v1] ARC: Add eBPF JIT support

2024-02-13 Thread Vineet Gupta
+CC Bjorn

On 2/13/24 18:39, Alexei Starovoitov wrote:
> On Tue, Feb 13, 2024 at 5:20 AM Shahab Vahedi  wrote:
>> From: Shahab Vahedi 
>>
>> This will add eBPF JIT support to the 32-bit ARCv2 processors. The
>> implementation is qualified by running the BPF tests on a Synopsys HSDK
>> board with "ARC HS38 v2.1c at 500 MHz" as the 4-core CPU.
> ...
>> Signed-off-by: Shahab Vahedi 
>> ---
>>  Documentation/admin-guide/sysctl/net.rst |1 +
>>  Documentation/networking/filter.rst  |4 +-
>>  arch/arc/Kbuild  |1 +
>>  arch/arc/Kconfig |1 +
>>  arch/arc/net/Makefile|6 +
>>  arch/arc/net/bpf_jit.h   |  161 ++
>>  arch/arc/net/bpf_jit_arcv2.c | 3001 ++
>>  arch/arc/net/bpf_jit_core.c  | 1425 ++
>>  8 files changed, 4598 insertions(+), 2 deletions(-)
> This is pretty cool to see.
> I'm assuming this will get reviewed and will go through arc.git tree.

I'd be happy to take it via ARC tree and can review some of the arch
specific bits, but I'd hope BPF folks also review it critically.

Thx,
-Vineet

> Could you share performance numbers interpreter vs JITed ?


___
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc


Re: [PATCH bpf-next v1] ARC: Add eBPF JIT support

2024-02-13 Thread Alexei Starovoitov
On Tue, Feb 13, 2024 at 5:20 AM Shahab Vahedi  wrote:
>
> From: Shahab Vahedi 
>
> This will add eBPF JIT support to the 32-bit ARCv2 processors. The
> implementation is qualified by running the BPF tests on a Synopsys HSDK
> board with "ARC HS38 v2.1c at 500 MHz" as the 4-core CPU.
...
> Signed-off-by: Shahab Vahedi 
> ---
>  Documentation/admin-guide/sysctl/net.rst |1 +
>  Documentation/networking/filter.rst  |4 +-
>  arch/arc/Kbuild  |1 +
>  arch/arc/Kconfig |1 +
>  arch/arc/net/Makefile|6 +
>  arch/arc/net/bpf_jit.h   |  161 ++
>  arch/arc/net/bpf_jit_arcv2.c | 3001 ++
>  arch/arc/net/bpf_jit_core.c  | 1425 ++
>  8 files changed, 4598 insertions(+), 2 deletions(-)

This is pretty cool to see.
I'm assuming this will get reviewed and will go through arc.git tree.

Could you share performance numbers interpreter vs JITed ?

___
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc


[PATCH bpf-next v1] ARC: Add eBPF JIT support

2024-02-13 Thread Shahab Vahedi
From: Shahab Vahedi 

This will add eBPF JIT support to the 32-bit ARCv2 processors. The
implementation is qualified by running the BPF tests on a Synopsys HSDK
board with "ARC HS38 v2.1c at 500 MHz" as the 4-core CPU.

Deployment and structure

The related codes are added to "arch/arc/net":

- bpf_jit.h   -- The interface that a back-end translator must provide
- bpf_jit_core.c  -- Knows how to handle the input eBPF byte stream
- bpf_jit_arcv2.c -- The back-end code that knows the translation logic

The bpf_int_jit_compile() at the end of bpf_jit_core.c is the entrance
to the whole process. Normally, the translation is done in one pass,
namely the "normal pass". In case some relocations are not known during
this pass, some data (arc_jit_data) is allocated for the next pass to
come. This possible next (and last) pass is called the "extra pass".

1. Normal pass   # The necessary pass
 1a. Dry run   # Get the whole JIT length, epilogue offset, etc.
 1b. Emit phase# Allocate memory and start emitting instructions
2. Extra pass# Only needed if there are relocations to be fixed
 2a. Patch relocations

Support status

This JIT compiler does NOT yet provide support for:

- Tail calls
- Atomic operations
- 64-bit division/remainder
- BPF_PROBE_MEM* (exception table)

The result of "test_bpf" test suite on an HSDK board is:

hsdk-lnx# insmod test_bpf.ko test_suite=test_bpf

  test_bpf: Summary: 863 PASSED, 186 FAILED, [851/851 JIT'ed]

All the failing test cases are due to the ones that were not JIT'ed.
Categorically, they can be represented as:

  .---..-.
  | test type |   opcodes  | # of cases  |
  |---++-|
  | atomic| 0xC3, 0xDB | 149 |
  | div64 | 0x37, 0x3F |  22 |
  | mod64 | 0x97, 0x9F |  15 |
  `---^+-|
   | (total) 186 |
   `-'

Setup: build config
---
The following configs must be set to have a working JIT test:

  CONFIG_BPF_JIT=y
  CONFIG_BPF_JIT_ALWAYS_ON=y
  CONFIG_TEST_BPF=m

The following options are not necessary for the tests module,
but are good to have:

  CONFIG_DEBUG_INFO=y # prerequisite for below
  CONFIG_DEBUG_INFO_BTF=y # so bpftool can generate vmlinux.h

  CONFIG_FTRACE=y #
  CONFIG_BPF_SYSCALL=y# all these options lead to
  CONFIG_KPROBE_EVENTS=y  # having CONFIG_BPF_EVENTS=y
  CONFIG_PERF_EVENTS=y#

Some BPF programs provide data through /sys/kernel/debug:
  CONFIG_DEBUG_FS=y
arc# mount -t debugfs debugfs /sys/kernel/debug

Setup: elfutils
---
The libdw.{so,a} library that is used by pahole for processing
the final binary must come from elfutils 0.189 or newer. The
support for ARCv2 [1] has been added since that version.

[1]
https://sourceware.org/git/?p=elfutils.git;a=commit;h=de3d46b3e7

Setup: pahole
-
The line below in linux/scripts/Makefile.btf must be commented out:

pahole-flags-$(call test-ge, $(pahole-ver), 121) += --btf_gen_floats

Or else, the build will fail:

$ make V=1
  ...
  BTF .btf.vmlinux.bin.o
pahole -J --btf_gen_floats\
   -j --lang_exclude=rust \
   --skip_encoding_btf_inconsistent_proto \
   --btf_gen_optimized .tmp_vmlinux.btf
Complex, interval and imaginary float types are not supported
Encountered error while encoding BTF.
  ...
  BTFIDS  vmlinux
./tools/bpf/resolve_btfids/resolve_btfids vmlinux
libbpf: failed to find '.BTF' ELF section in vmlinux
FAILED: load BTF from vmlinux: No data available

This is due to the fact that the ARC toolchains generate
"complex float" DIE entries in libgcc and at the moment, pahole
can't handle such entries.

Running the tests
-
host$ scp /bld/linux/lib/test_bpf.ko arc:
arc # sysctl net.core.bpf_jit_enable=1
arc # insmod test_bpf.ko test_suite=test_bpf
  ...
  test_bpf: #1048 Staggered jumps: JMP32_JSLE_X jited:1 697811 PASS
  test_bpf: Summary: 863 PASSED, 186 FAILED, [851/851 JIT'ed]

Acknowledgments
---
- Claudiu Zissulescu for his unwavering support
- Yuriy Kolerov for testing and troubleshooting
- Vladimir Isaev for the pahole workaround
- Sergey Matyukevich for paving the road by adding the interpretor support

Signed-off-by: Shahab Vahedi 
---
 Documentation/admin-guide/sysctl/net.rst |1 +
 Documentation/networking/filter.rst  |4 +-
 arch/arc/Kbuild  |1 +
 arch/arc/Kconfig |1 +
 arch/arc/net/Makefile|6 +
 arch/arc/net/bpf_jit.h   |  161 ++
 arch/arc/net/bpf_jit_arcv2.c | 3001 ++
 arch/arc/net/bpf_jit_core.c  | 1425 ++
 8 files changed, 4598 insertions(+), 2 deletions(-)
 create mode 100644