aboutsummaryrefslogtreecommitdiffstats
path: root/mm/huge_memory.c
diff options
context:
space:
mode:
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>2016-12-12 19:44:29 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2016-12-12 21:55:08 -0500
commit1dd38b6c27d59414e89c08dd1ae9677a8e12cbc4 (patch)
tree77d216598637e2365570434268ffff5bde987045 /mm/huge_memory.c
parent763b218ddfaf56761c19923beb7e16656f66ec62 (diff)
mm: move vma_is_anonymous check within pmd_move_must_withdraw
Independent of whether the vma is for anonymous memory, some arches like ppc64 would like to override pmd_move_must_withdraw(). One option is to encapsulate the vma_is_anonymous() check for general architectures inside pmd_move_must_withdraw() so that is always called and architectures that need unconditional overriding can override this function. ppc64 needs to override the function when the MMU is configured to use hash PTE's. [bsingharora@gmail.com: reworked changelog] Link: http://lkml.kernel.org/r/20161113150025.17942-1-aneesh.kumar@linux.vnet.ibm.com Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Acked-by: Michael Ellerman <mpe@ellerman.id.au> (powerpc) Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Michael Neuling <mikey@neuling.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Balbir Singh <bsingharora@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/huge_memory.c')
-rw-r--r--mm/huge_memory.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index 26fd1161ca85..b54044c21076 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -1429,6 +1429,21 @@ int zap_huge_pmd(struct mmu_gather *tlb, struct vm_area_struct *vma,
1429 return 1; 1429 return 1;
1430} 1430}
1431 1431
1432#ifndef pmd_move_must_withdraw
1433static inline int pmd_move_must_withdraw(spinlock_t *new_pmd_ptl,
1434 spinlock_t *old_pmd_ptl,
1435 struct vm_area_struct *vma)
1436{
1437 /*
1438 * With split pmd lock we also need to move preallocated
1439 * PTE page table if new_pmd is on different PMD page table.
1440 *
1441 * We also don't deposit and withdraw tables for file pages.
1442 */
1443 return (new_pmd_ptl != old_pmd_ptl) && vma_is_anonymous(vma);
1444}
1445#endif
1446
1432bool move_huge_pmd(struct vm_area_struct *vma, unsigned long old_addr, 1447bool move_huge_pmd(struct vm_area_struct *vma, unsigned long old_addr,
1433 unsigned long new_addr, unsigned long old_end, 1448 unsigned long new_addr, unsigned long old_end,
1434 pmd_t *old_pmd, pmd_t *new_pmd, bool *need_flush) 1449 pmd_t *old_pmd, pmd_t *new_pmd, bool *need_flush)
@@ -1466,8 +1481,7 @@ bool move_huge_pmd(struct vm_area_struct *vma, unsigned long old_addr,
1466 force_flush = true; 1481 force_flush = true;
1467 VM_BUG_ON(!pmd_none(*new_pmd)); 1482 VM_BUG_ON(!pmd_none(*new_pmd));
1468 1483
1469 if (pmd_move_must_withdraw(new_ptl, old_ptl) && 1484 if (pmd_move_must_withdraw(new_ptl, old_ptl, vma)) {
1470 vma_is_anonymous(vma)) {
1471 pgtable_t pgtable; 1485 pgtable_t pgtable;
1472 pgtable = pgtable_trans_huge_withdraw(mm, old_pmd); 1486 pgtable = pgtable_trans_huge_withdraw(mm, old_pmd);
1473 pgtable_trans_huge_deposit(mm, new_pmd, pgtable); 1487 pgtable_trans_huge_deposit(mm, new_pmd, pgtable);