diff options
-rw-r--r-- | include/asm-generic/pgtable.h | 5 | ||||
-rw-r--r-- | mm/huge_memory.c | 3 | ||||
-rw-r--r-- | mm/pgtable-generic.c | 11 |
3 files changed, 17 insertions, 2 deletions
diff --git a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h index 044939f21c16..ebdd74fb8d6a 100644 --- a/include/asm-generic/pgtable.h +++ b/include/asm-generic/pgtable.h | |||
@@ -170,6 +170,11 @@ extern void pgtable_trans_huge_deposit(struct mm_struct *mm, pgtable_t pgtable); | |||
170 | extern pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm); | 170 | extern pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm); |
171 | #endif | 171 | #endif |
172 | 172 | ||
173 | #ifndef __HAVE_ARCH_PMDP_INVALIDATE | ||
174 | extern void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address, | ||
175 | pmd_t *pmdp); | ||
176 | #endif | ||
177 | |||
173 | #ifndef __HAVE_ARCH_PTE_SAME | 178 | #ifndef __HAVE_ARCH_PTE_SAME |
174 | static inline int pte_same(pte_t pte_a, pte_t pte_b) | 179 | static inline int pte_same(pte_t pte_a, pte_t pte_b) |
175 | { | 180 | { |
diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 9ea6d1953765..bec6243b6965 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c | |||
@@ -1361,8 +1361,7 @@ static int __split_huge_page_map(struct page *page, | |||
1361 | * SMP TLB and finally we write the non-huge version | 1361 | * SMP TLB and finally we write the non-huge version |
1362 | * of the pmd entry with pmd_populate. | 1362 | * of the pmd entry with pmd_populate. |
1363 | */ | 1363 | */ |
1364 | set_pmd_at(mm, address, pmd, pmd_mknotpresent(*pmd)); | 1364 | pmdp_invalidate(vma, address, pmd); |
1365 | flush_tlb_range(vma, address, address + HPAGE_PMD_SIZE); | ||
1366 | pmd_populate(mm, pmd, pgtable); | 1365 | pmd_populate(mm, pmd, pgtable); |
1367 | ret = 1; | 1366 | ret = 1; |
1368 | } | 1367 | } |
diff --git a/mm/pgtable-generic.c b/mm/pgtable-generic.c index 29867e083d37..e642627da6b7 100644 --- a/mm/pgtable-generic.c +++ b/mm/pgtable-generic.c | |||
@@ -159,3 +159,14 @@ pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm) | |||
159 | } | 159 | } |
160 | #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ | 160 | #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ |
161 | #endif | 161 | #endif |
162 | |||
163 | #ifndef __HAVE_ARCH_PMDP_INVALIDATE | ||
164 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | ||
165 | void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address, | ||
166 | pmd_t *pmdp) | ||
167 | { | ||
168 | set_pmd_at(vma->vm_mm, address, pmdp, pmd_mknotpresent(*pmdp)); | ||
169 | flush_tlb_range(vma, address, address + HPAGE_PMD_SIZE); | ||
170 | } | ||
171 | #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ | ||
172 | #endif | ||