aboutsummaryrefslogtreecommitdiff
path: root/mm
diff options
context:
space:
mode:
authorMark Brown <broonie@kernel.org>2014-10-10 12:55:50 +0100
committerMark Brown <broonie@kernel.org>2014-10-10 12:55:50 +0100
commitf8ba86b7fbe99740c82a7442a0c94e7584dd02bf (patch)
treebfe82e7b0c48e50b34a0d3cfdd0c02dd8b7737f4 /mm
parent0ee8bb9c4864ee826e6c669f230562cd0fed8722 (diff)
parentf41c15f2c9a00489735036846ec7e474e52b14a6 (diff)
Merge tag 'v3.10.57' into linux-linaro-lsk
This is the 3.10.57 stable release
Diffstat (limited to 'mm')
-rw-r--r--mm/huge_memory.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index eb00e81601a5..d21c9ef0943c 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -1733,21 +1733,24 @@ static int __split_huge_page_map(struct page *page,
if (pmd) {
pgtable = pgtable_trans_huge_withdraw(mm);
pmd_populate(mm, &_pmd, pgtable);
+ if (pmd_write(*pmd))
+ BUG_ON(page_mapcount(page) != 1);
haddr = address;
for (i = 0; i < HPAGE_PMD_NR; i++, haddr += PAGE_SIZE) {
pte_t *pte, entry;
BUG_ON(PageCompound(page+i));
+ /*
+ * Note that pmd_numa is not transferred deliberately
+ * to avoid any possibility that pte_numa leaks to
+ * a PROT_NONE VMA by accident.
+ */
entry = mk_pte(page + i, vma->vm_page_prot);
entry = maybe_mkwrite(pte_mkdirty(entry), vma);
if (!pmd_write(*pmd))
entry = pte_wrprotect(entry);
- else
- BUG_ON(page_mapcount(page) != 1);
if (!pmd_young(*pmd))
entry = pte_mkold(entry);
- if (pmd_numa(*pmd))
- entry = pte_mknuma(entry);
pte = pte_offset_map(&_pmd, haddr);
BUG_ON(!pte_none(*pte));
set_pte_at(mm, haddr, pte, entry);