Skip to content

Commit 7800a3d

Browse files
committed
Merge branch 'bpf-riscv-jit-improvements'
Björn Töpel says: ==================== This series contain one non-critical fix, support for far jumps, and some optimizations for the BPF JIT. Previously, the JIT only supported 12b branch targets for conditional branches, and 21b for unconditional branches. Starting with this series, 32b branching is supported. As part of supporting far jumps, branch relaxation was introduced. The idea is to start with a pessimistic jump (e.g. auipc/jalr) and for each pass the JIT will have an opportunity to pick a better instruction (e.g. jal) and shrink the image. Instead of two passes, the JIT requires more passes. It typically converges after 3 passes. The optimizations mentioned in the subject are for calls and tail calls. In the tail call generation we can save one instruction by using the offset in jalr. Calls are optimized by doing (auipc)/jal(r) relative jumps instead of loading the entire absolute address and doing jalr. This required that the JIT image allocator was made RISC-V specific, so we can ensure that the JIT image and the kernel text are in range (32b). The last two patches of the series is not critical to the series, but are two UAPI build issues for BPF events. A closer look from the RV-folks would be much appreciated. The test_bpf.ko module, selftests/bpf/test_verifier and selftests/seccomp/seccomp_bpf pass all tests. RISC-V is still missing proper kprobe and tracepoint support, so a lot of BPF selftests cannot be run. v1->v2: [1] * Removed unused function parameter from emit_branch() * Added patch to support far branch in tail call emit [1] https://lore.kernel.org/bpf/[email protected]/ ==================== Signed-off-by: Daniel Borkmann <[email protected]>
2 parents a352a82 + 34bfc10 commit 7800a3d

File tree

5 files changed

+312
-238
lines changed

5 files changed

+312
-238
lines changed

arch/riscv/include/asm/perf_event.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,8 @@ struct riscv_pmu {
8282
int irq;
8383
};
8484

85+
#ifdef CONFIG_PERF_EVENTS
86+
#define perf_arch_bpf_user_pt_regs(regs) (struct user_regs_struct *)regs
87+
#endif
88+
8589
#endif /* _ASM_RISCV_PERF_EVENT_H */

arch/riscv/include/asm/pgtable.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,10 @@ static inline int ptep_clear_flush_young(struct vm_area_struct *vma,
404404
#define VMALLOC_END (PAGE_OFFSET - 1)
405405
#define VMALLOC_START (PAGE_OFFSET - VMALLOC_SIZE)
406406

407+
#define BPF_JIT_REGION_SIZE (SZ_128M)
408+
#define BPF_JIT_REGION_START (PAGE_OFFSET - BPF_JIT_REGION_SIZE)
409+
#define BPF_JIT_REGION_END (VMALLOC_END)
410+
407411
/*
408412
* Roughly size the vmemmap space to be large enough to fit enough
409413
* struct pages to map half the virtual address space. Then
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2+
#ifndef _UAPI__ASM_BPF_PERF_EVENT_H__
3+
#define _UAPI__ASM_BPF_PERF_EVENT_H__
4+
5+
#include <asm/ptrace.h>
6+
7+
typedef struct user_regs_struct bpf_user_pt_regs_t;
8+
9+
#endif /* _UAPI__ASM_BPF_PERF_EVENT_H__ */

0 commit comments

Comments
 (0)