projects
/
GitHub
/
moto-9609
/
android_kernel_motorola_exynos9610.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
cc56939
)
powerpc/mm: Call flush_tlb_kernel_range with interrupts enabled
author
Guenter Roeck
<linux@roeck-us.net>
Sun, 24 Sep 2017 17:30:43 +0000
(10:30 -0700)
committer
Michael Ellerman
<mpe@ellerman.id.au>
Wed, 4 Oct 2017 11:15:30 +0000
(22:15 +1100)
flush_tlb_kernel_range() may call smp_call_function_many() which expects
interrupts to be enabled. This results in a traceback.
WARNING: CPU: 0 PID: 1 at kernel/smp.c:416 smp_call_function_many+0xcc/0x2fc
CPU: 0 PID: 1 Comm: swapper/0 Not tainted
4.14.0-rc1-00009-g0666f56
#1
task:
cf830000
task.stack:
cf82e000
NIP:
c00a93c8
LR:
c00a9634
CTR:
00000001
REGS:
cf82fde0
TRAP: 0700 Not tainted (
4.14.0-rc1-00009-g0666f56
)
MSR:
00021000
<CE,ME> CR:
24000082
XER:
00000000
GPR00:
c00a9634
cf82fe90
cf830000
c050ad3c
c0015a54
00000000
00000001
00000001
GPR08:
00000001
00000000
00000000
cf82e000
24000084
00000000
c0003150
00000000
GPR16:
00000000
00000000
00000000
00000000
00000000
00000001
00000000
c0510000
GPR24:
00000000
c0015a54
00000000
c050ad3c
c051823c
c050ad3c
00000025
00000000
NIP [
c00a93c8
] smp_call_function_many+0xcc/0x2fc
LR [
c00a9634
] smp_call_function+0x3c/0x50
Call Trace:
[
cf82fe90
] [
00000010
] 0x10 (unreliable)
[
cf82fed0
] [
c00a9634
] smp_call_function+0x3c/0x50
[
cf82fee0
] [
c0015d2c
] flush_tlb_kernel_range+0x20/0x38
[
cf82fef0
] [
c001524c
] mark_initmem_nx+0x154/0x16c
[
cf82ff20
] [
c001484c
] free_initmem+0x20/0x4c
[
cf82ff30
] [
c000316c
] kernel_init+0x1c/0x108
[
cf82ff40
] [
c000f3a8
] ret_from_kernel_thread+0x5c/0x64
Instruction dump:
7c0803a6
7d808120
38210040
4e800020
3d20c052
812981a0
2f890000
40beffac
3d20c051
8929ac64
2f890000
40beff9c
<
0fe00000
>
4bffff94
7fc3f378
7f64db78
Fixes:
3184cc4b6f6a
("powerpc/mm: Fix kernel RAM protection after freeing ...")
Fixes:
e611939fc8ec
("powerpc/mm: Ensure change_page_attr() doesn't ...")
Cc: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Reviewed-by: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/mm/pgtable_32.c
patch
|
blob
|
blame
|
history
diff --git
a/arch/powerpc/mm/pgtable_32.c
b/arch/powerpc/mm/pgtable_32.c
index 65eda1997c3f8750c899294bc1d9bb15215d9426..f6c7f54c05157e226c5426798b6fa0f379f8becb 100644
(file)
--- a/
arch/powerpc/mm/pgtable_32.c
+++ b/
arch/powerpc/mm/pgtable_32.c
@@
-361,9
+361,9
@@
static int change_page_attr(struct page *page, int numpages, pgprot_t prot)
break;
}
wmb();
+ local_irq_restore(flags);
flush_tlb_kernel_range((unsigned long)page_address(start),
(unsigned long)page_address(page));
- local_irq_restore(flags);
return err;
}