Revert "hugetlbfs: flush TLBs correctly after huge_pmd_unshare"
This reverts commit 3e6ef90f75ae9cd27cd0469a67c9ff3dac9b1309.
Reason for revert: Arm presubmit fails.
Change-Id: I19adcd8d201a830a37799737173593a32401cfee
Reviewed-on: https://cos-review.googlesource.com/c/third_party/kernel/+/25761
Reviewed-by: Vaibhav Rustagi <vaibhavrustagi@google.com>
Tested-by: Cusky Presubmit Bot <presubmit@cos-infra-prod.iam.gserviceaccount.com>
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index 20da6ed..95a32749 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -3589,7 +3589,6 @@
struct hstate *h = hstate_vma(vma);
unsigned long sz = huge_page_size(h);
struct mmu_notifier_range range;
- bool force_flush = false;
WARN_ON(!is_vm_hugetlb_page(vma));
BUG_ON(start & ~huge_page_mask(h));
@@ -3618,8 +3617,10 @@
ptl = huge_pte_lock(h, mm, ptep);
if (huge_pmd_unshare(mm, &address, ptep)) {
spin_unlock(ptl);
- tlb_flush_pmd_range(tlb, address & PUD_MASK, PUD_SIZE);
- force_flush = true;
+ /*
+ * We just unmapped a page of PMDs by clearing a PUD.
+ * The caller's TLB flush range should cover this area.
+ */
continue;
}
@@ -3676,22 +3677,6 @@
}
mmu_notifier_invalidate_range_end(&range);
tlb_end_vma(tlb, vma);
-
- /*
- * If we unshared PMDs, the TLB flush was not recorded in mmu_gather. We
- * could defer the flush until now, since by holding i_mmap_rwsem we
- * guaranteed that the last refernece would not be dropped. But we must
- * do the flushing before we return, as otherwise i_mmap_rwsem will be
- * dropped and the last reference to the shared PMDs page might be
- * dropped as well.
- *
- * In theory we could defer the freeing of the PMD pages as well, but
- * huge_pmd_unshare() relies on the exact page_count for the PMD page to
- * detect sharing, so we cannot defer the release of the page either.
- * Instead, do flush now.
- */
- if (force_flush)
- tlb_flush_mmu_tlbonly(tlb);
}
void __unmap_hugepage_range_final(struct mmu_gather *tlb,