--- /dev/null
+From mgorman@suse.de Tue Jan 7 09:46:03 2014
+From: Mel Gorman <mgorman@suse.de>
+Date: Tue, 7 Jan 2014 14:00:38 +0000
+Subject: mm: clear pmd_numa before invalidating
+To: gregkh@linuxfoundation.org
+Cc: athorlton@sgi.com, riel@redhat.com, chegu_vinod@hp.com, Mel Gorman <mgorman@suse.de>, stable@vger.kernel.org
+Message-ID: <1389103248-17617-4-git-send-email-mgorman@suse.de>
+
+From: Mel Gorman <mgorman@suse.de>
+
+commit 67f87463d3a3362424efcbe8b40e4772fd34fc61 upstream.
+
+On x86, PMD entries are similar to _PAGE_PROTNONE protection and are
+handled as NUMA hinting faults. The following two page table protection
+bits are what defines them
+
+ _PAGE_NUMA:set _PAGE_PRESENT:clear
+
+A PMD is considered present if any of the _PAGE_PRESENT, _PAGE_PROTNONE,
+_PAGE_PSE or _PAGE_NUMA bits are set. If pmdp_invalidate encounters a
+pmd_numa, it clears the present bit leaving _PAGE_NUMA which will be
+considered not present by the CPU but present by pmd_present. The
+existing caller of pmdp_invalidate should handle it but it's an
+inconsistent state for a PMD. This patch keeps the state consistent
+when calling pmdp_invalidate.
+
+Signed-off-by: Mel Gorman <mgorman@suse.de>
+Reviewed-by: Rik van Riel <riel@redhat.com>
+Cc: Alex Thorlton <athorlton@sgi.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ mm/pgtable-generic.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/mm/pgtable-generic.c
++++ b/mm/pgtable-generic.c
+@@ -191,6 +191,9 @@ pgtable_t pgtable_trans_huge_withdraw(st
+ void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address,
+ pmd_t *pmdp)
+ {
++ pmd_t entry = *pmdp;
++ if (pmd_numa(entry))
++ entry = pmd_mknonnuma(entry);
+ set_pmd_at(vma->vm_mm, address, pmdp, pmd_mknotpresent(*pmdp));
+ flush_tlb_range(vma, address, address + HPAGE_PMD_SIZE);
+ }