diff options
author | Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> | 2016-12-12 19:44:29 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-12-12 21:55:08 -0500 |
commit | 1dd38b6c27d59414e89c08dd1ae9677a8e12cbc4 (patch) | |
tree | 77d216598637e2365570434268ffff5bde987045 /mm/huge_memory.c | |
parent | 763b218ddfaf56761c19923beb7e16656f66ec62 (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.c | 18 |
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 | ||
1433 | static 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 | |||
1432 | bool move_huge_pmd(struct vm_area_struct *vma, unsigned long old_addr, | 1447 | bool 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); |