|
@@ -126,6 +126,7 @@ pmd_t pmdp_clear_flush(struct vm_area_struct *vma, unsigned long address,
|
|
|
{
|
|
|
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;
|
|
@@ -198,3 +199,19 @@ void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address,
|
|
|
}
|
|
|
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
|
|
|
#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
|