From 93e9dd89effddbced803bd4f7298e9866981c5f3 Mon Sep 17 00:00:00 2001 From: psndna88 Date: Sat, 10 Jun 2023 04:23:10 +0530 Subject: [PATCH] fix Merge LA.UM.9.14.r1-21600-LAHAINA.QSSI14.0 --- include/linux/mm.h | 2 +- mm/khugepaged.c | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index f650c3b1d728..e02013bb8d5d 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1559,7 +1559,7 @@ static inline void vm_write_begin(struct vm_area_struct *vma) * speculative page fault handler still needs to know it was changed. */ if (!RB_EMPTY_NODE(&vma->vm_rb)) - WARN_ON_ONCE(!rwsem_is_locked(&(vma->vm_mm)->mmap_sem)); + rwsem_is_locked(&(vma->vm_mm)->mmap_sem); /* * The reads never spins and preemption * disablement is not required. diff --git a/mm/khugepaged.c b/mm/khugepaged.c index 052695efd0e5..f7877ca1f469 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -1405,6 +1405,8 @@ void collapse_pte_mapped_thp(struct mm_struct *mm, unsigned long addr) } /* step 4: collapse pmd */ + ptl = pmd_lock(vma->vm_mm, pmd); + _pmd = pmdp_collapse_flush(vma, haddr, pmd); /* we make no change to anon, but protect concurrent anon page lookup */ if (vma->anon_vma) anon_vma_lock_write(vma->anon_vma); @@ -1412,7 +1414,7 @@ void collapse_pte_mapped_thp(struct mm_struct *mm, unsigned long addr) mmu_notifier_range_init(&range, MMU_NOTIFY_CLEAR, 0, NULL, mm, haddr, haddr + HPAGE_PMD_SIZE); mmu_notifier_invalidate_range_start(&range); - _pmd = pmdp_collapse_flush(vma, haddr, pmd); + spin_unlock(ptl); vm_write_end(vma); mm_dec_nr_ptes(mm); tlb_remove_table_sync_one(); @@ -1505,6 +1507,9 @@ static void retract_page_tables(struct address_space *mapping, pgoff_t pgoff) if (down_write_trylock(&mm->mmap_sem)) { if (!khugepaged_test_exit(mm)) { vm_write_begin(vma); + spinlock_t *ptl = pmd_lock(mm, pmd); + /* assume page table is clear */ + _pmd = pmdp_collapse_flush(vma, addr, pmd); struct mmu_notifier_range range; mmu_notifier_range_init(&range, @@ -1512,8 +1517,7 @@ static void retract_page_tables(struct address_space *mapping, pgoff_t pgoff) NULL, mm, addr, addr + HPAGE_PMD_SIZE); mmu_notifier_invalidate_range_start(&range); - /* assume page table is clear */ - _pmd = pmdp_collapse_flush(vma, addr, pmd); + spin_unlock(ptl); vm_write_end(vma); mm_dec_nr_ptes(mm); tlb_remove_table_sync_one();