projects
/
linux-2.6-microblaze.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
b7296f9
)
LoongArch: Enable IRQ if do_ale() triggered in irq-enabled context
author
Huacai Chen
<chenhuacai@loongson.cn>
Mon, 21 Oct 2024 14:11:19 +0000
(22:11 +0800)
committer
Huacai Chen
<chenhuacai@loongson.cn>
Mon, 21 Oct 2024 14:11:19 +0000
(22:11 +0800)
Unaligned access exception can be triggered in irq-enabled context such
as user mode, in this case do_ale() may call get_user() which may cause
sleep. Then we will get:
BUG: sleeping function called from invalid context at arch/loongarch/kernel/access-helper.h:7
in_atomic(): 0, irqs_disabled(): 1, non_block: 0, pid: 129, name: modprobe
preempt_count: 0, expected: 0
RCU nest depth: 0, expected: 0
CPU: 0 UID: 0 PID: 129 Comm: modprobe Tainted: G W 6.12.0-rc1+ #1723
Tainted: [W]=WARN
Stack :
9000000105e0bd48
0000000000000000
9000000003803944
9000000105e08000
9000000105e0bc70
9000000105e0bc78
0000000000000000
0000000000000000
9000000105e0bc78
0000000000000001
9000000185e0ba07
9000000105e0b890
ffffffffffffffff
9000000105e0bc78
73924b81763be05b
9000000100194500
000000000000020c
000000000000000a
0000000000000000
0000000000000003
00000000000023f0
00000000000e1401
00000000072f8000
0000007ffbb0e260
0000000000000000
0000000000000000
9000000005437650
90000000055d5000
0000000000000000
0000000000000003
0000007ffbb0e1f0
0000000000000000
0000005567b00490
0000000000000000
9000000003803964
0000007ffbb0dfec
00000000000000b0
0000000000000007
0000000000000003
0000000000071c1d
...
Call Trace:
[<
9000000003803964
>] show_stack+0x64/0x1a0
[<
9000000004c57464
>] dump_stack_lvl+0x74/0xb0
[<
9000000003861ab4
>] __might_resched+0x154/0x1a0
[<
900000000380c96c
>] emulate_load_store_insn+0x6c/0xf60
[<
9000000004c58118
>] do_ale+0x78/0x180
[<
9000000003801bc8
>] handle_ale+0x128/0x1e0
So enable IRQ if unaligned access exception is triggered in irq-enabled
context to fix it.
Cc: stable@vger.kernel.org
Reported-by: Binbin Zhou <zhoubinbin@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/kernel/traps.c
patch
|
blob
|
history
diff --git
a/arch/loongarch/kernel/traps.c
b/arch/loongarch/kernel/traps.c
index
f9f4eb0
..
c57b413
100644
(file)
--- a/
arch/loongarch/kernel/traps.c
+++ b/
arch/loongarch/kernel/traps.c
@@
-555,6
+555,9
@@
asmlinkage void noinstr do_ale(struct pt_regs *regs)
#else
unsigned int *pc;
+ if (regs->csr_prmd & CSR_PRMD_PIE)
+ local_irq_enable();
+
perf_sw_event(PERF_COUNT_SW_ALIGNMENT_FAULTS, 1, regs, regs->csr_badvaddr);
/*
@@
-579,6
+582,8
@@
sigbus:
die_if_kernel("Kernel ale access", regs);
force_sig_fault(SIGBUS, BUS_ADRALN, (void __user *)regs->csr_badvaddr);
out:
+ if (regs->csr_prmd & CSR_PRMD_PIE)
+ local_irq_disable();
#endif
irqentry_exit(regs, state);
}