projects
/
openwrt
/
staging
/
blogic.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
16f73eb
)
parisc: Handle vma's whose context is not current in flush_cache_range
author
John David Anglin
<
[email protected]
>
Sun, 30 Jul 2017 20:20:19 +0000
(16:20 -0400)
committer
Helge Deller
<
[email protected]
>
Mon, 31 Jul 2017 06:22:33 +0000
(08:22 +0200)
In testing James' patch to drivers/parisc/pdc_stable.c, I hit the BUG
statement in flush_cache_range() during a system shutdown:
kernel BUG at arch/parisc/kernel/cache.c:595!
CPU: 2 PID: 6532 Comm: kworker/2:0 Not tainted 4.13.0-rc2+ #1
Workqueue: events free_ioctx
IAOQ[0]: flush_cache_range+0x144/0x148
IAOQ[1]: flush_cache_page+0x0/0x1a8
RP(r2): flush_cache_range+0xec/0x148
Backtrace:
[<
00000000402910ac
>] unmap_page_range+0x84/0x880
[<
00000000402918f4
>] unmap_single_vma+0x4c/0x60
[<
0000000040291a18
>] zap_page_range_single+0x110/0x160
[<
0000000040291c34
>] unmap_mapping_range+0x174/0x1a8
[<
000000004026ccd8
>] truncate_pagecache+0x50/0xa8
[<
000000004026cd84
>] truncate_setsize+0x54/0x70
[<
000000004033d534
>] put_aio_ring_file+0x44/0xb0
[<
000000004033d5d8
>] aio_free_ring+0x38/0x140
[<
000000004033d714
>] free_ioctx+0x34/0xa8
[<
00000000401b0028
>] process_one_work+0x1b8/0x4d0
[<
00000000401b04f4
>] worker_thread+0x1b4/0x648
[<
00000000401b9128
>] kthread+0x1b0/0x208
[<
0000000040150020
>] end_fault_vector+0x20/0x28
[<
0000000040639518
>] nf_ip_reroute+0x50/0xa8
[<
0000000040638ed0
>] nf_ip_route+0x10/0x78
[<
0000000040638c90
>] xfrm4_mode_tunnel_input+0x180/0x1f8
CPU: 2 PID: 6532 Comm: kworker/2:0 Not tainted 4.13.0-rc2+ #1
Workqueue: events free_ioctx
Backtrace:
[<
0000000040163bf0
>] show_stack+0x20/0x38
[<
0000000040688480
>] dump_stack+0xa8/0x120
[<
0000000040163dc4
>] die_if_kernel+0x19c/0x2b0
[<
0000000040164d0c
>] handle_interruption+0xa24/0xa48
This patch modifies flush_cache_range() to handle non current contexts.
In as much as this occurs infrequently, the simplest approach is to
flush the entire cache when this happens.
Signed-off-by: John David Anglin <
[email protected]
>
Cc:
[email protected]
# 4.9+
Signed-off-by: Helge Deller <
[email protected]
>
arch/parisc/kernel/cache.c
patch
|
blob
|
history
diff --git
a/arch/parisc/kernel/cache.c
b/arch/parisc/kernel/cache.c
index 85a92db70afc99ab9151924823a3e277f1c0e8c5..19c0c141bc3f9f0edd509708f978a2d7ca16c230 100644
(file)
--- a/
arch/parisc/kernel/cache.c
+++ b/
arch/parisc/kernel/cache.c
@@
-587,13
+587,12
@@
void flush_cache_range(struct vm_area_struct *vma,
if (parisc_requires_coherency())
flush_tlb_range(vma, start, end);
- if ((end - start) >= parisc_cache_flush_threshold) {
+ if ((end - start) >= parisc_cache_flush_threshold
+ || vma->vm_mm->context != mfsp(3)) {
flush_cache_all();
return;
}
- BUG_ON(vma->vm_mm->context != mfsp(3));
-
flush_user_dcache_range_asm(start, end);
if (vma->vm_flags & VM_EXEC)
flush_user_icache_range_asm(start, end);