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>
This commit is contained in:
parent
763b218ddf
commit
1dd38b6c27
|
@ -1009,7 +1009,8 @@ static inline void pmdp_huge_split_prepare(struct vm_area_struct *vma,
|
||||||
#define pmd_move_must_withdraw pmd_move_must_withdraw
|
#define pmd_move_must_withdraw pmd_move_must_withdraw
|
||||||
struct spinlock;
|
struct spinlock;
|
||||||
static inline int pmd_move_must_withdraw(struct spinlock *new_pmd_ptl,
|
static inline int pmd_move_must_withdraw(struct spinlock *new_pmd_ptl,
|
||||||
struct spinlock *old_pmd_ptl)
|
struct spinlock *old_pmd_ptl,
|
||||||
|
struct vm_area_struct *vma)
|
||||||
{
|
{
|
||||||
if (radix_enabled())
|
if (radix_enabled())
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -652,18 +652,6 @@ static inline pmd_t pmd_read_atomic(pmd_t *pmdp)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef pmd_move_must_withdraw
|
|
||||||
static inline int pmd_move_must_withdraw(spinlock_t *new_pmd_ptl,
|
|
||||||
spinlock_t *old_pmd_ptl)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* With split pmd lock we also need to move preallocated
|
|
||||||
* PTE page table if new_pmd is on different PMD page table.
|
|
||||||
*/
|
|
||||||
return new_pmd_ptl != old_pmd_ptl;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function is meant to be used by sites walking pagetables with
|
* This function is meant to be used by sites walking pagetables with
|
||||||
* the mmap_sem hold in read mode to protect against MADV_DONTNEED and
|
* the mmap_sem hold in read mode to protect against MADV_DONTNEED and
|
||||||
|
|
|
@ -1429,6 +1429,21 @@ int zap_huge_pmd(struct mmu_gather *tlb, struct vm_area_struct *vma,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef pmd_move_must_withdraw
|
||||||
|
static inline int pmd_move_must_withdraw(spinlock_t *new_pmd_ptl,
|
||||||
|
spinlock_t *old_pmd_ptl,
|
||||||
|
struct vm_area_struct *vma)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* With split pmd lock we also need to move preallocated
|
||||||
|
* PTE page table if new_pmd is on different PMD page table.
|
||||||
|
*
|
||||||
|
* We also don't deposit and withdraw tables for file pages.
|
||||||
|
*/
|
||||||
|
return (new_pmd_ptl != old_pmd_ptl) && vma_is_anonymous(vma);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
bool move_huge_pmd(struct vm_area_struct *vma, unsigned long old_addr,
|
bool move_huge_pmd(struct vm_area_struct *vma, unsigned long old_addr,
|
||||||
unsigned long new_addr, unsigned long old_end,
|
unsigned long new_addr, unsigned long old_end,
|
||||||
pmd_t *old_pmd, pmd_t *new_pmd, bool *need_flush)
|
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,
|
||||||
force_flush = true;
|
force_flush = true;
|
||||||
VM_BUG_ON(!pmd_none(*new_pmd));
|
VM_BUG_ON(!pmd_none(*new_pmd));
|
||||||
|
|
||||||
if (pmd_move_must_withdraw(new_ptl, old_ptl) &&
|
if (pmd_move_must_withdraw(new_ptl, old_ptl, vma)) {
|
||||||
vma_is_anonymous(vma)) {
|
|
||||||
pgtable_t pgtable;
|
pgtable_t pgtable;
|
||||||
pgtable = pgtable_trans_huge_withdraw(mm, old_pmd);
|
pgtable = pgtable_trans_huge_withdraw(mm, old_pmd);
|
||||||
pgtable_trans_huge_deposit(mm, new_pmd, pgtable);
|
pgtable_trans_huge_deposit(mm, new_pmd, pgtable);
|
||||||
|
|
Loading…
Reference in New Issue