powerpc/mm: use generic version of pmdp_clear_flush()
Also move the pmd_trans_huge check to generic code. Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: Martin Schwidefsky <schwidefsky@de.ibm.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
15a25b2ead
commit
f28b6ff8c3
|
@ -573,10 +573,6 @@ extern int pmdp_clear_flush_young(struct vm_area_struct *vma,
|
||||||
extern pmd_t pmdp_get_and_clear(struct mm_struct *mm,
|
extern pmd_t pmdp_get_and_clear(struct mm_struct *mm,
|
||||||
unsigned long addr, pmd_t *pmdp);
|
unsigned long addr, pmd_t *pmdp);
|
||||||
|
|
||||||
#define __HAVE_ARCH_PMDP_CLEAR_FLUSH
|
|
||||||
extern pmd_t pmdp_clear_flush(struct vm_area_struct *vma, unsigned long address,
|
|
||||||
pmd_t *pmdp);
|
|
||||||
|
|
||||||
#define __HAVE_ARCH_PMDP_SET_WRPROTECT
|
#define __HAVE_ARCH_PMDP_SET_WRPROTECT
|
||||||
static inline void pmdp_set_wrprotect(struct mm_struct *mm, unsigned long addr,
|
static inline void pmdp_set_wrprotect(struct mm_struct *mm, unsigned long addr,
|
||||||
pmd_t *pmdp)
|
pmd_t *pmdp)
|
||||||
|
|
|
@ -554,17 +554,6 @@ unsigned long pmd_hugepage_update(struct mm_struct *mm, unsigned long addr,
|
||||||
return old;
|
return old;
|
||||||
}
|
}
|
||||||
|
|
||||||
pmd_t pmdp_clear_flush(struct vm_area_struct *vma, unsigned long address,
|
|
||||||
pmd_t *pmdp)
|
|
||||||
{
|
|
||||||
pmd_t pmd;
|
|
||||||
|
|
||||||
VM_BUG_ON(address & ~HPAGE_PMD_MASK);
|
|
||||||
VM_BUG_ON(!pmd_trans_huge(*pmdp));
|
|
||||||
pmd = pmdp_get_and_clear(vma->vm_mm, address, pmdp);
|
|
||||||
return pmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
pmd_t pmdp_collapse_flush(struct vm_area_struct *vma, unsigned long address,
|
pmd_t pmdp_collapse_flush(struct vm_area_struct *vma, unsigned long address,
|
||||||
pmd_t *pmdp)
|
pmd_t *pmdp)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1548,6 +1548,14 @@ static inline void pmdp_set_wrprotect(struct mm_struct *mm,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline pmd_t pmdp_collapse_flush(struct vm_area_struct *vma,
|
||||||
|
unsigned long address,
|
||||||
|
pmd_t *pmdp)
|
||||||
|
{
|
||||||
|
return pmdp_get_and_clear(vma->vm_mm, address, pmdp);
|
||||||
|
}
|
||||||
|
#define pmdp_collapse_flush pmdp_collapse_flush
|
||||||
|
|
||||||
#define pfn_pmd(pfn, pgprot) mk_pmd_phys(__pa((pfn) << PAGE_SHIFT), (pgprot))
|
#define pfn_pmd(pfn, pgprot) mk_pmd_phys(__pa((pfn) << PAGE_SHIFT), (pgprot))
|
||||||
#define mk_pmd(page, pgprot) pfn_pmd(page_to_pfn(page), (pgprot))
|
#define mk_pmd(page, pgprot) pfn_pmd(page_to_pfn(page), (pgprot))
|
||||||
|
|
||||||
|
|
|
@ -191,13 +191,8 @@ extern void pmdp_splitting_flush(struct vm_area_struct *vma,
|
||||||
|
|
||||||
#ifndef pmdp_collapse_flush
|
#ifndef pmdp_collapse_flush
|
||||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||||
static inline pmd_t pmdp_collapse_flush(struct vm_area_struct *vma,
|
extern pmd_t pmdp_collapse_flush(struct vm_area_struct *vma,
|
||||||
unsigned long address,
|
unsigned long address, pmd_t *pmdp);
|
||||||
pmd_t *pmdp)
|
|
||||||
{
|
|
||||||
return pmdp_clear_flush(vma, address, pmdp);
|
|
||||||
}
|
|
||||||
#define pmdp_collapse_flush pmdp_collapse_flush
|
|
||||||
#else
|
#else
|
||||||
static inline pmd_t pmdp_collapse_flush(struct vm_area_struct *vma,
|
static inline pmd_t pmdp_collapse_flush(struct vm_area_struct *vma,
|
||||||
unsigned long address,
|
unsigned long address,
|
||||||
|
|
|
@ -126,6 +126,7 @@ pmd_t pmdp_clear_flush(struct vm_area_struct *vma, unsigned long address,
|
||||||
{
|
{
|
||||||
pmd_t pmd;
|
pmd_t pmd;
|
||||||
VM_BUG_ON(address & ~HPAGE_PMD_MASK);
|
VM_BUG_ON(address & ~HPAGE_PMD_MASK);
|
||||||
|
VM_BUG_ON(!pmd_trans_huge(*pmdp));
|
||||||
pmd = pmdp_get_and_clear(vma->vm_mm, address, pmdp);
|
pmd = pmdp_get_and_clear(vma->vm_mm, address, pmdp);
|
||||||
flush_tlb_range(vma, address, address + HPAGE_PMD_SIZE);
|
flush_tlb_range(vma, address, address + HPAGE_PMD_SIZE);
|
||||||
return pmd;
|
return pmd;
|
||||||
|
@ -198,3 +199,19 @@ void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address,
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
|
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef pmdp_collapse_flush
|
||||||
|
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||||
|
pmd_t pmdp_collapse_flush(struct vm_area_struct *vma, unsigned long address,
|
||||||
|
pmd_t *pmdp)
|
||||||
|
{
|
||||||
|
pmd_t pmd;
|
||||||
|
|
||||||
|
VM_BUG_ON(address & ~HPAGE_PMD_MASK);
|
||||||
|
VM_BUG_ON(pmd_trans_huge(*pmdp));
|
||||||
|
pmd = pmdp_get_and_clear(vma->vm_mm, address, pmdp);
|
||||||
|
flush_tlb_range(vma, address, address + HPAGE_PMD_SIZE);
|
||||||
|
return pmd;
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
|
||||||
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue