]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.16-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 6 Oct 2014 15:40:14 +0000 (08:40 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 6 Oct 2014 15:40:14 +0000 (08:40 -0700)
added patches:
mm-numa-do-not-mark-ptes-pte_numa-when-splitting-huge-pages.patch
mm-thp-move-invariant-bug-check-out-of-loop-in-__split_huge_page_map.patch

queue-3.16/mm-numa-do-not-mark-ptes-pte_numa-when-splitting-huge-pages.patch [new file with mode: 0644]
queue-3.16/mm-thp-move-invariant-bug-check-out-of-loop-in-__split_huge_page_map.patch [new file with mode: 0644]
queue-3.16/series

diff --git a/queue-3.16/mm-numa-do-not-mark-ptes-pte_numa-when-splitting-huge-pages.patch b/queue-3.16/mm-numa-do-not-mark-ptes-pte_numa-when-splitting-huge-pages.patch
new file mode 100644 (file)
index 0000000..95cd7fb
--- /dev/null
@@ -0,0 +1,61 @@
+From abc40bd2eeb77eb7c2effcaf63154aad929a1d5f Mon Sep 17 00:00:00 2001
+From: Mel Gorman <mgorman@suse.de>
+Date: Thu, 2 Oct 2014 19:47:42 +0100
+Subject: mm: numa: Do not mark PTEs pte_numa when splitting huge pages
+
+From: Mel Gorman <mgorman@suse.de>
+
+commit abc40bd2eeb77eb7c2effcaf63154aad929a1d5f upstream.
+
+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.
+
+Signed-off-by: Mel Gorman <mgorman@suse.de>
+Acked-by: Rik van Riel <riel@redhat.com>
+Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ mm/huge_memory.c |    7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+--- a/mm/huge_memory.c
++++ b/mm/huge_memory.c
+@@ -1782,14 +1782,17 @@ static int __split_huge_page_map(struct
+               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);
+                       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);
diff --git a/queue-3.16/mm-thp-move-invariant-bug-check-out-of-loop-in-__split_huge_page_map.patch b/queue-3.16/mm-thp-move-invariant-bug-check-out-of-loop-in-__split_huge_page_map.patch
new file mode 100644 (file)
index 0000000..3da430a
--- /dev/null
@@ -0,0 +1,54 @@
+From f8303c2582b889351e261ff18c4d8eb197a77db2 Mon Sep 17 00:00:00 2001
+From: Waiman Long <Waiman.Long@hp.com>
+Date: Wed, 6 Aug 2014 16:05:36 -0700
+Subject: mm, thp: move invariant bug check out of loop in __split_huge_page_map
+
+From: Waiman Long <Waiman.Long@hp.com>
+
+commit f8303c2582b889351e261ff18c4d8eb197a77db2 upstream.
+
+In __split_huge_page_map(), the check for page_mapcount(page) is
+invariant within the for loop.  Because of the fact that the macro is
+implemented using atomic_read(), the redundant check cannot be optimized
+away by the compiler leading to unnecessary read to the page structure.
+
+This patch moves the invariant bug check out of the loop so that it will
+be done only once.  On a 3.16-rc1 based kernel, the execution time of a
+microbenchmark that broke up 1000 transparent huge pages using munmap()
+had an execution time of 38,245us and 38,548us with and without the
+patch respectively.  The performance gain is about 1%.
+
+Signed-off-by: Waiman Long <Waiman.Long@hp.com>
+Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
+Cc: Andrea Arcangeli <aarcange@redhat.com>
+Cc: Mel Gorman <mgorman@suse.de>
+Cc: Rik van Riel <riel@redhat.com>
+Cc: Scott J Norton <scott.norton@hp.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/huge_memory.c |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/mm/huge_memory.c
++++ b/mm/huge_memory.c
+@@ -1775,6 +1775,8 @@ static int __split_huge_page_map(struct
+       if (pmd) {
+               pgtable = pgtable_trans_huge_withdraw(mm, pmd);
+               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) {
+@@ -1784,8 +1786,6 @@ static int __split_huge_page_map(struct
+                       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))
index 1c58f1276615404cefcced2e4c3fb292a280e46f..7949c92646f09df99c4a9b38062613ba257884fb 100644 (file)
@@ -20,3 +20,5 @@ uas-disable-uas-on-asm1051-devices.patch
 uas-add-missing-le16_to_cpu-calls-to-asm1051-asm1053-usb-id-check.patch
 x86-ia64-move-efi_fb-vga_default_device-initialization-to-pci_vga_fixup.patch
 vgaarb-don-t-default-exclusively-to-first-video-device-with-mem-io.patch
+mm-thp-move-invariant-bug-check-out-of-loop-in-__split_huge_page_map.patch
+mm-numa-do-not-mark-ptes-pte_numa-when-splitting-huge-pages.patch