On Sun, Oct 05, 2014 at 04:42:11PM -0700, gregkh@xxxxxxxxxxxxxxxxxxx wrote: > > The patch below does not apply to the 3.16-stable tree. > If someone wants it applied there, or to any other stable or longterm > tree, then please email the backport, including the original git commit > id to <stable@xxxxxxxxxxxxxxx>. > > thanks, > > greg k-h > > ------------------ original commit in Linus's tree ------------------ > > From abc40bd2eeb77eb7c2effcaf63154aad929a1d5f Mon Sep 17 00:00:00 2001 > From: Mel Gorman <mgorman@xxxxxxx> > Date: Thu, 2 Oct 2014 19:47:42 +0100 > Subject: [PATCH] mm: numa: Do not mark PTEs pte_numa when splitting huge pages > > This patch reverts 1ba6e0b50b ("mm: numa: split_huge_page: transfer the > NUMA type from the pmd to the pte"). If a huge page is being split due > a protection change and the tail will be in a PROT_NONE vma then NUMA > hinting PTEs are temporarily created in the protected VMA. > Hi Greg, A rebased patch is below. If you would prefer to match upstream then I suggest you pull in f8303c2582b889351e261ff18c4d8eb197a77db2 ("mm, thp: move invariant bug check out of loop in __split_huge_page_map"). It's a harmless patch with a small performance gain and once applied then commit abc40bd2eeb77eb7c2effcaf63154aad929a1d5f should have no conflicts. I'm happy with either option. Thanks. ---8<--- >From 68798346945250e17dcddd50489a9980ffc7c7e7 Mon Sep 17 00:00:00 2001 From: Mel Gorman <mgorman@xxxxxxx> Date: Thu, 2 Oct 2014 19:47:42 +0100 Subject: [PATCH] mm: numa: Do not mark PTEs pte_numa when splitting huge pages This patch reverts 1ba6e0b50b ("mm: numa: split_huge_page: transfer the NUMA type from the pmd to the pte"). If a huge page is being split due a protection change and the tail will be in a PROT_NONE vma then NUMA hinting PTEs are temporarily created in the protected VMA. VM_RW|VM_PROTNONE |-----------------| ^ split here In the specific case above, it should get fixed up by change_pte_range() but there is a window of opportunity for weirdness to happen. Similarly, if a huge page is shrunk and split during a protection update but before pmd_numa is cleared then a pte_numa can be left behind. Instead of adding complexity trying to deal with the case, this patch will not mark PTEs NUMA when splitting a huge page. NUMA hinting faults will not be triggered which is marginal in comparison to the complexity in dealing with the corner cases during THP split. Cc: stable@xxxxxxxxxxxxxxx Signed-off-by: Mel Gorman <mgorman@xxxxxxx> Acked-by: Rik van Riel <riel@xxxxxxxxxx> Acked-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> Signed-off-by: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> --- mm/huge_memory.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 33514d8..03e5063 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -1780,6 +1780,11 @@ static int __split_huge_page_map(struct page *page, 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)) @@ -1788,8 +1793,6 @@ static int __split_huge_page_map(struct page *page, 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); -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html