diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/huge_memory.c | 3 | ||||
-rw-r--r-- | mm/pgtable-generic.c | 11 |
2 files changed, 12 insertions, 2 deletions
diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 9ea6d195376..bec6243b696 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 29867e083d3..e642627da6b 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 | ||