]> git.ipfire.org Git - thirdparty/kernel/stable.git/commit
ARC: mm: don't loose PTE_SPECIAL in pte_modify()
authorVineet Gupta <vgupta@synopsys.com>
Thu, 28 Jul 2016 18:35:50 +0000 (11:35 -0700)
committerSasha Levin <alexander.levin@verizon.com>
Mon, 22 Aug 2016 16:23:22 +0000 (12:23 -0400)
commit77c6ffdbce68688492a31702f67c7dbc4eeedd62
treee9be00c56059103f52d529f8f4e35fb215416280
parent2d6adadf00191b2ba195ba6e8446fc35bc66a338
ARC: mm: don't loose PTE_SPECIAL in pte_modify()

[ Upstream commit 3925a16ae980c79d1a8fd182d7f9487da1edd4dc ]

LTP madvise05 was generating mm splat

| [ARCLinux]# /sd/ltp/testcases/bin/madvise05
| BUG: Bad page map in process madvise05  pte:80e08211 pmd:9f7d4000
| page:9fdcfc90 count:1 mapcount:-1 mapping:  (null) index:0x0 flags: 0x404(referenced|reserved)
| page dumped because: bad pte
| addr:200b8000 vm_flags:00000070 anon_vma:  (null) mapping:  (null) index:1005c
| file:  (null) fault:  (null) mmap:  (null) readpage:  (null)
| CPU: 2 PID: 6707 Comm: madvise05

And for newer kernels, the system was rendered unusable afterwards.

The problem was mprotect->pte_modify() clearing PTE_SPECIAL (which is
set to identify the special zero page wired to the pte).
When pte was finally unmapped, special casing for zero page was not
done, and instead it was treated as a "normal" page, tripping on the
map counts etc.

This fixes ARC STAR 9001053308

Cc: <stable@vger.kernel.org>
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
arch/arc/include/asm/pgtable.h