]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
Revert "riscv: misaligned: fix sleeping function called during misaligned access...
authorNam Cao <namcao@linutronix.de>
Fri, 20 Jun 2025 11:09:39 +0000 (13:09 +0200)
committerPalmer Dabbelt <palmer@dabbelt.com>
Mon, 23 Jun 2025 22:38:09 +0000 (15:38 -0700)
This reverts commit 61a74ad25462 ("riscv: misaligned: fix sleeping function
called during misaligned access handling"). The commit addresses a sleeping
in atomic context problem, but it is not the correct fix as explained by
Clément:

"Using nofault would lead to failure to read from user memory that is paged
out for instance. This is not really acceptable, we should handle user
misaligned access even at an address that would generate a page fault."

This bug has been properly fixed by commit 453805f0a28f ("riscv:
misaligned: enable IRQs while handling misaligned accesses").

Revert this improper fix.

Link: https://lore.kernel.org/linux-riscv/b779beed-e44e-4a5e-9551-4647682b0d21@rivosinc.com/
Signed-off-by: Nam Cao <namcao@linutronix.de>
Cc: stable@vger.kernel.org
Reviewed-by: Clément Léger <cleger@rivosinc.com>
Reviewed-by: Alexandre Ghiti <alexghiti@rivosinc.com>
Fixes: 61a74ad25462 ("riscv: misaligned: fix sleeping function called during misaligned access handling")
Link: https://lore.kernel.org/r/20250620110939.1642735-1-namcao@linutronix.de
Signed-off-by: Palmer Dabbelt <palmer@dabbelt.com>
arch/riscv/kernel/traps_misaligned.c

index dd8e4af6583f47d2cce8cab61bcd92e7d642a11f..93043924fe6c608c9fa8ee322096450a3963e614 100644 (file)
@@ -454,7 +454,7 @@ static int handle_scalar_misaligned_load(struct pt_regs *regs)
 
        val.data_u64 = 0;
        if (user_mode(regs)) {
-               if (copy_from_user_nofault(&val, (u8 __user *)addr, len))
+               if (copy_from_user(&val, (u8 __user *)addr, len))
                        return -1;
        } else {
                memcpy(&val, (u8 *)addr, len);
@@ -555,7 +555,7 @@ static int handle_scalar_misaligned_store(struct pt_regs *regs)
                return -EOPNOTSUPP;
 
        if (user_mode(regs)) {
-               if (copy_to_user_nofault((u8 __user *)addr, &val, len))
+               if (copy_to_user((u8 __user *)addr, &val, len))
                        return -1;
        } else {
                memcpy((u8 *)addr, &val, len);