From 017d6a09a39c49fbf4e48574e413cae939c3f3af Mon Sep 17 00:00:00 2001 From: Gerald Schaefer Date: Mon, 8 Oct 2012 16:30:09 -0700 Subject: [PATCH] --- yaml --- r: 332377 b: refs/heads/master c: 46dcde735c9d8953bbd8d105ca6779e5b5300c28 h: refs/heads/master i: 332375: e12d898b05bd9b177c221a6458744e910367a5db v: v3 --- [refs] | 2 +- trunk/include/asm-generic/pgtable.h | 5 +++++ trunk/mm/huge_memory.c | 3 +-- trunk/mm/pgtable-generic.c | 11 +++++++++++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 358b64e091a7..40ad16e5b879 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e3ebcf64381188a2744a9829a4eb5c2b60f1974c +refs/heads/master: 46dcde735c9d8953bbd8d105ca6779e5b5300c28 diff --git a/trunk/include/asm-generic/pgtable.h b/trunk/include/asm-generic/pgtable.h index 044939f21c16..ebdd74fb8d6a 100644 --- a/trunk/include/asm-generic/pgtable.h +++ b/trunk/include/asm-generic/pgtable.h @@ -170,6 +170,11 @@ extern void pgtable_trans_huge_deposit(struct mm_struct *mm, pgtable_t pgtable); extern pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm); #endif +#ifndef __HAVE_ARCH_PMDP_INVALIDATE +extern void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address, + pmd_t *pmdp); +#endif + #ifndef __HAVE_ARCH_PTE_SAME static inline int pte_same(pte_t pte_a, pte_t pte_b) { diff --git a/trunk/mm/huge_memory.c b/trunk/mm/huge_memory.c index 9ea6d1953765..bec6243b6965 100644 --- a/trunk/mm/huge_memory.c +++ b/trunk/mm/huge_memory.c @@ -1361,8 +1361,7 @@ static int __split_huge_page_map(struct page *page, * SMP TLB and finally we write the non-huge version * of the pmd entry with pmd_populate. */ - set_pmd_at(mm, address, pmd, pmd_mknotpresent(*pmd)); - flush_tlb_range(vma, address, address + HPAGE_PMD_SIZE); + pmdp_invalidate(vma, address, pmd); pmd_populate(mm, pmd, pgtable); ret = 1; } diff --git a/trunk/mm/pgtable-generic.c b/trunk/mm/pgtable-generic.c index 29867e083d37..e642627da6b7 100644 --- a/trunk/mm/pgtable-generic.c +++ b/trunk/mm/pgtable-generic.c @@ -159,3 +159,14 @@ pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm) } #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ #endif + +#ifndef __HAVE_ARCH_PMDP_INVALIDATE +#ifdef CONFIG_TRANSPARENT_HUGEPAGE +void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address, + pmd_t *pmdp) +{ + set_pmd_at(vma->vm_mm, address, pmdp, pmd_mknotpresent(*pmdp)); + flush_tlb_range(vma, address, address + HPAGE_PMD_SIZE); +} +#endif /* CONFIG_TRANSPARENT_HUGEPAGE */ +#endif