Unverified Commit 0274b8a5 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!12468 mm/khugepaged: invoke MMU notifiers in shmem/file collapse paths

parents b06363ce 7d310301
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -1454,6 +1454,7 @@ void collapse_pte_mapped_thp(struct mm_struct *mm, unsigned long addr)
	spinlock_t *ptl;
	int count = 0;
	int i;
	struct mmu_notifier_range range;

	if (!vma || !vma->vm_file ||
	    vma->vm_start > haddr || vma->vm_end < haddr + HPAGE_PMD_SIZE)
@@ -1528,9 +1529,13 @@ void collapse_pte_mapped_thp(struct mm_struct *mm, unsigned long addr)

	/* step 4: collapse pmd */
	ptl = pmd_lock(vma->vm_mm, pmd);
	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);
	mm_dec_nr_ptes(mm);
	mmu_notifier_invalidate_range_end(&range);
	pte_free(mm, pmd_pgtable(_pmd));

drop_hpage:
@@ -1612,11 +1617,19 @@ static void retract_page_tables(struct address_space *mapping, pgoff_t pgoff)
		if (mmap_write_trylock(mm)) {
			if (!khugepaged_test_exit(mm)) {
				spinlock_t *ptl = pmd_lock(mm, pmd);
				struct mmu_notifier_range range;

				mmu_notifier_range_init(&range,
							MMU_NOTIFY_CLEAR, 0,
							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);
				mm_dec_nr_ptes(mm);
				pte_free(mm, pmd_pgtable(_pmd));
				mmu_notifier_invalidate_range_end(&range);
			}
			mmap_write_unlock(mm);
		} else {