diff mbox series

riscv, mm: Perform BPF exhandler fixup on page fault

Message ID 20230214162515.184827-1-bjorn@kernel.org (mailing list archive)
State Accepted
Commit 416721ff05fddc58ca531b6f069de250301de6e5
Delegated to: Palmer Dabbelt
Headers show
Series riscv, mm: Perform BPF exhandler fixup on page fault | expand

Checks

Context Check Description
conchuod/cover_letter success Single patches do not need cover letters
conchuod/tree_selection success Guessed tree name to be fixes
conchuod/fixes_present success Fixes tag present in non-next series
conchuod/maintainers_pattern success MAINTAINERS pattern errors before the patch: 13 and now 13
conchuod/verify_signedoff success Signed-off-by tag matches author and committer
conchuod/kdoc success Errors and warnings before: 0 this patch: 0
conchuod/build_rv64_clang_allmodconfig success Errors and warnings before: 3 this patch: 3
conchuod/module_param success Was 0 now: 0
conchuod/build_rv64_gcc_allmodconfig success Errors and warnings before: 19 this patch: 19
conchuod/alphanumeric_selects success Out of order selects before the patch: 729 and now 729
conchuod/build_rv32_defconfig success Build OK
conchuod/dtb_warn_rv64 success Errors and warnings before: 2 this patch: 2
conchuod/header_inline success No static functions without inline keyword in header files
conchuod/checkpatch success total: 0 errors, 0 warnings, 0 checks, 16 lines checked
conchuod/source_inline success Was 0 now: 0
conchuod/build_rv64_nommu_k210_defconfig success Build OK
conchuod/verify_fixes success Fixes tag looks correct
conchuod/build_rv64_nommu_virt_defconfig success Build OK

Commit Message

Björn Töpel Feb. 14, 2023, 4:25 p.m. UTC
From: Björn Töpel <bjorn@rivosinc.com>

Commit 21855cac82d3 ("riscv/mm: Prevent kernel module to access user
memory without uaccess routines") added early exits/deaths for page
faults stemming from accesses to user-space without using proper
uaccess routines (where sstatus.SUM is set).

Unfortunatly, this is too strict for some BPF programs, which relies
on BPF exhandler fixups. These BPF programs loads "BTF pointers". A
BTF pointers could either be a valid kernel pointer or NULL, but not a
userspace address.

Resolve the problem by calling the fixup handler in the early exit
path.

Fixes: 21855cac82d3 ("riscv/mm: Prevent kernel module to access user memory without uaccess routines")
Signed-off-by: Björn Töpel <bjorn@rivosinc.com>
---
Palmer,

This is a fix for BPF on riscv, but I'd still like to take it via the
RISC-V tree, given the mm changes.

BPF/BTF is a special snowflake, and needs special care. ;-)

If BPF_PROBE_MEM is ever to be used for usermode pointers in the
future, then the fixup call can be removed, in favor of setting
sstatus.SUM from the BPF jitted code.


Björn
---
 arch/riscv/mm/fault.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)


base-commit: 950b879b7f0251317d26bae0687e72592d607532

Comments

patchwork-bot+linux-riscv@kernel.org Feb. 22, 2023, 3 p.m. UTC | #1
Hello:

This patch was applied to riscv/linux.git (for-next)
by Palmer Dabbelt <palmer@rivosinc.com>:

On Tue, 14 Feb 2023 17:25:15 +0100 you wrote:
> From: Björn Töpel <bjorn@rivosinc.com>
> 
> Commit 21855cac82d3 ("riscv/mm: Prevent kernel module to access user
> memory without uaccess routines") added early exits/deaths for page
> faults stemming from accesses to user-space without using proper
> uaccess routines (where sstatus.SUM is set).
> 
> [...]

Here is the summary with links:
  - riscv, mm: Perform BPF exhandler fixup on page fault
    https://git.kernel.org/riscv/c/416721ff05fd

You are awesome, thank you!
diff mbox series

Patch

diff --git a/arch/riscv/mm/fault.c b/arch/riscv/mm/fault.c
index d86f7cebd4a7..eb0774d9c03b 100644
--- a/arch/riscv/mm/fault.c
+++ b/arch/riscv/mm/fault.c
@@ -267,10 +267,12 @@  asmlinkage void do_page_fault(struct pt_regs *regs)
 	if (user_mode(regs))
 		flags |= FAULT_FLAG_USER;
 
-	if (!user_mode(regs) && addr < TASK_SIZE &&
-			unlikely(!(regs->status & SR_SUM)))
-		die_kernel_fault("access to user memory without uaccess routines",
-				addr, regs);
+	if (!user_mode(regs) && addr < TASK_SIZE && unlikely(!(regs->status & SR_SUM))) {
+		if (fixup_exception(regs))
+			return;
+
+		die_kernel_fault("access to user memory without uaccess routines", addr, regs);
+	}
 
 	perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, addr);