--- v8
+++ v4
@@ -1,29 +1,46 @@
-mremap HAVE_MOVE_PMD/PUD optimization time comparison for 1GB region:
-1GB mremap - Source PTE-aligned, Destination PTE-aligned
- mremap time: 2292772ns
-1GB mremap - Source PMD-aligned, Destination PMD-aligned
- mremap time: 1158928ns
-1GB mremap - Source PUD-aligned, Destination PUD-aligned
- mremap time: 63886ns
+pmd/pud_populate is the right interface to be used to set the respective
+page table entries. Some architectures like ppc64 do assume that set_pmd/pud_at
+can only be used to set a hugepage PTE. Since we are not setting up a hugepage
+PTE here, use the pmd/pud_populate interface.
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
---
- arch/powerpc/platforms/Kconfig.cputype | 2 ++
- 1 file changed, 2 insertions(+)
+ mm/mremap.c | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
-diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype
-index f998e655b570..be8ceb5bece4 100644
---- a/arch/powerpc/platforms/Kconfig.cputype
-+++ b/arch/powerpc/platforms/Kconfig.cputype
-@@ -101,6 +101,8 @@ config PPC_BOOK3S_64
- select ARCH_ENABLE_THP_MIGRATION if TRANSPARENT_HUGEPAGE
- select ARCH_SUPPORTS_HUGETLBFS
- select ARCH_SUPPORTS_NUMA_BALANCING
-+ select HAVE_MOVE_PMD
-+ select HAVE_MOVE_PUD
- select IRQ_WORK
- select PPC_MM_SLICES
- select PPC_HAVE_KUEP
+diff --git a/mm/mremap.c b/mm/mremap.c
+index ec8f840399ed..574287f9bb39 100644
+--- a/mm/mremap.c
++++ b/mm/mremap.c
+@@ -26,6 +26,7 @@
+
+ #include <asm/cacheflush.h>
+ #include <asm/tlbflush.h>
++#include <asm/pgalloc.h>
+
+ #include "internal.h"
+
+@@ -257,9 +258,8 @@ static bool move_normal_pmd(struct vm_area_struct *vma, unsigned long old_addr,
+ pmd_clear(old_pmd);
+
+ VM_BUG_ON(!pmd_none(*new_pmd));
++ pmd_populate(mm, new_pmd, (pgtable_t)pmd_page_vaddr(pmd));
+
+- /* Set the new pmd */
+- set_pmd_at(mm, new_addr, new_pmd, pmd);
+ flush_tlb_range(vma, old_addr, old_addr + PMD_SIZE);
+ if (new_ptl != old_ptl)
+ spin_unlock(new_ptl);
+@@ -306,8 +306,7 @@ static bool move_normal_pud(struct vm_area_struct *vma, unsigned long old_addr,
+
+ VM_BUG_ON(!pud_none(*new_pud));
+
+- /* Set the new pud */
+- set_pud_at(mm, new_addr, new_pud, pud);
++ pud_populate(mm, new_pud, (pmd_t *)pud_page_vaddr(pud));
+ flush_tlb_range(vma, old_addr, old_addr + PUD_SIZE);
+ if (new_ptl != old_ptl)
+ spin_unlock(new_ptl);
--
-2.31.1
+2.30.2