projects
/
wrapfs-5.3.y.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
8c2cb77
)
MIPS: Fix page table corruption on THP permission changes.
author
David Daney
<david.daney@cavium.com>
Thu, 16 Jun 2016 22:50:31 +0000
(15:50 -0700)
committer
Sasha Levin
<alexander.levin@verizon.com>
Wed, 20 Jul 2016 15:35:52 +0000
(11:35 -0400)
[ Upstream commit
88d02a2ba6c52350f9a73ff1b01a5be839c3ca17
]
When the core THP code is modifying the permissions of a huge page it
calls pmd_modify(), which unfortunately was clearing the _PAGE_HUGE bit
of the page table entry. The result can be kernel messages like:
mm/memory.c:397: bad pmd
000000040080004d
.
mm/memory.c:397: bad pmd
00000003ff00004d
.
mm/memory.c:397: bad pmd
000000040100004d
.
or:
------------[ cut here ]------------
WARNING: at mm/mmap.c:3200 exit_mmap+0x150/0x158()
Modules linked in: ipv6 at24 octeon3_ethernet octeon_srio_nexus m25p80
CPU: 12 PID: 1295 Comm: pmderr Not tainted 3.10.87-rt80-Cavium-Octeon #4
Stack :
0000000040808000
0000000014009ce1
0000000000400004
ffffffff81076ba0
0000000000000000
0000000000000000
ffffffff85110000
0000000000000119
0000000000000004
0000000000000000
0000000000000119
43617669756d2d4f
0000000000000000
ffffffff850fda40
ffffffff85110000
0000000000000000
0000000000000000
0000000000000009
ffffffff809207a0
0000000000000c80
ffffffff80f1bf20
0000000000000001
000000ffeca36828
0000000000000001
0000000000000000
0000000000000001
000000ffeca7e700
ffffffff80886924
80000003fd7a0000
80000003fd7a39b0
80000003fdea8000
ffffffff80885780
80000003fdea8000
ffffffff80f12218
000000000000000c
000000000000050f
0000000000000000
ffffffff80865c4c
0000000000000000
0000000000000000
...
Call Trace:
[<
ffffffff80865c4c
>] show_stack+0x6c/0xf8
[<
ffffffff80885780
>] warn_slowpath_common+0x78/0xa8
[<
ffffffff809207a0
>] exit_mmap+0x150/0x158
[<
ffffffff80882d44
>] mmput+0x5c/0x110
[<
ffffffff8088b450
>] do_exit+0x230/0xa68
[<
ffffffff8088be34
>] do_group_exit+0x54/0x1d0
[<
ffffffff8088bfc0
>] __wake_up_parent+0x0/0x18
---[ end trace
c7b38293191c57dc
]---
BUG: Bad rss-counter state mm:
80000003fa168000
idx:1 val:1536
Fix by not clearing _PAGE_HUGE bit.
Signed-off-by: David Daney <david.daney@cavium.com>
Tested-by: Aaro Koskinen <aaro.koskinen@nokia.com>
Cc: stable@vger.kernel.org
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/13687/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
arch/mips/include/asm/pgtable.h
patch
|
blob
|
history
diff --git
a/arch/mips/include/asm/pgtable.h
b/arch/mips/include/asm/pgtable.h
index 060fc2e50cd2229404b2b097b341383a27ae4d2f..825dd09e80a4173bf073430c44234b18ac070f1a 100644
(file)
--- a/
arch/mips/include/asm/pgtable.h
+++ b/
arch/mips/include/asm/pgtable.h
@@
-596,7
+596,8
@@
static inline struct page *pmd_page(pmd_t pmd)
static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot)
{
- pmd_val(pmd) = (pmd_val(pmd) & _PAGE_CHG_MASK) | pgprot_val(newprot);
+ pmd_val(pmd) = (pmd_val(pmd) & (_PAGE_CHG_MASK | _PAGE_HUGE)) |
+ (pgprot_val(newprot) & ~_PAGE_CHG_MASK);
return pmd;
}