aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorAndrea Arcangeli <aarcange@redhat.com>2021-02-06 04:04:00 -0500
committerAndrea Arcangeli <aarcange@redhat.com>2023-11-11 22:03:35 -0500
commit49fdcd35db477d691efc7bd295c33fe66e113d54 (patch)
tree65962ea030a46d29468fd75a32d42e2bef3f8c4c
parentd1ddd6ea363334c030f91b640df448ca3829ba53 (diff)
downloadaa-49fdcd35db477d691efc7bd295c33fe66e113d54.tar.gz
mm: thp: replace the page lock with the seqlock for the THP mapcount
The page lock has been superseded by the THP mapcount seqlock. This reverts commit 1c2f67308af4c102b4e1e6cd6f69819ae59408e0. This reverts commit c444eb564fb16645c172d550359cb3d75fe8a040. Signed-off-by: Andrea Arcangeli <aarcange@redhat.com>
-rw-r--r--mm/huge_memory.c40
1 files changed, 3 insertions, 37 deletions
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index 7fbdf7a87745e6..b85c8f43becf56 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -2214,8 +2214,6 @@ void __split_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd,
{
spinlock_t *ptl;
struct mmu_notifier_range range;
- bool do_unlock_page = false;
- pmd_t _pmd;
mmu_notifier_range_init(&range, MMU_NOTIFY_CLEAR, 0, vma, vma->vm_mm,
address & HPAGE_PMD_MASK,
@@ -2228,41 +2226,11 @@ void __split_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd,
* pmd against. Otherwise we can end up replacing wrong page.
*/
VM_BUG_ON(freeze && !page);
- if (page) {
- VM_WARN_ON_ONCE(!PageLocked(page));
- if (page != pmd_page(*pmd))
- goto out;
- }
+ if (page && page != pmd_page(*pmd))
+ goto out;
-repeat:
if (pmd_trans_huge(*pmd)) {
- if (!page) {
- page = pmd_page(*pmd);
- /*
- * An anonymous page must be locked, to ensure that a
- * concurrent reuse_swap_page() sees stable mapcount;
- * but reuse_swap_page() is not used on shmem or file,
- * and page lock must not be taken when zap_pmd_range()
- * calls __split_huge_pmd() while i_mmap_lock is held.
- */
- if (PageAnon(page)) {
- if (unlikely(!trylock_page(page))) {
- get_page(page);
- _pmd = *pmd;
- spin_unlock(ptl);
- lock_page(page);
- spin_lock(ptl);
- if (unlikely(!pmd_same(*pmd, _pmd))) {
- unlock_page(page);
- put_page(page);
- page = NULL;
- goto repeat;
- }
- put_page(page);
- }
- do_unlock_page = true;
- }
- }
+ page = pmd_page(*pmd);
if (PageMlocked(page))
clear_page_mlock(page);
} else if (!(pmd_devmap(*pmd) || is_pmd_migration_entry(*pmd)))
@@ -2270,8 +2238,6 @@ repeat:
__split_huge_pmd_locked(vma, pmd, range.start, freeze);
out:
spin_unlock(ptl);
- if (do_unlock_page)
- unlock_page(page);
/*
* No need to double call mmu_notifier->invalidate_range() callback.
* They are 3 cases to consider inside __split_huge_pmd_locked():