Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 365a5b7a authored by Suren Baghdasaryan's avatar Suren Baghdasaryan Committed by Gerrit - the friendly Code Review server
Browse files

ANDROID: mm/khugepaged: add missing vm_write_{begin|end}



Speculative page fault handler needs to detect concurrent pmd changes
and relies on vma seqcount for that. pmdp_collapse_flush(), set_huge_pmd() and collapse_and_free_pmd() can modify a pmd.
vm_write_{begin|end} are needed in the paths which can call these
functions for page fault handler to detect pmd changes.

Bug: 257443051
Change-Id: Ieb784b5f44901b66a594f61b9e7c91190ff97f80
Signed-off-by: default avatarSuren Baghdasaryan <surenb@google.com>
Git-commit: 5ed391bd8ad8481d82c1bbb05a35f5538966dce9
Git-repo: https://android.googlesource.com/kernel/common/


Signed-off-by: default avatarSrinivasarao Pathipati <quic_c_spathi@quicinc.com>
parent 5b5bd362
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -1343,6 +1343,7 @@ void collapse_pte_mapped_thp(struct mm_struct *mm, unsigned long addr)
	if (!pmd)
		goto drop_hpage;

	vm_write_begin(vma);
	start_pte = pte_offset_map_lock(mm, pmd, haddr, &ptl);

	/* step 1: check all mapped PTEs are to the right huge page */
@@ -1392,6 +1393,7 @@ void collapse_pte_mapped_thp(struct mm_struct *mm, unsigned long addr)
	ptl = pmd_lock(vma->vm_mm, pmd);
	_pmd = pmdp_collapse_flush(vma, haddr, pmd);
	spin_unlock(ptl);
	vm_write_end(vma);
	mm_dec_nr_ptes(mm);
	pte_free(mm, pmd_pgtable(_pmd));

@@ -1402,6 +1404,7 @@ void collapse_pte_mapped_thp(struct mm_struct *mm, unsigned long addr)

abort:
	pte_unmap_unlock(start_pte, ptl);
	vm_write_end(vma);
	goto drop_hpage;
}

@@ -1473,10 +1476,12 @@ 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);
				spin_unlock(ptl);
				vm_write_end(vma);
				mm_dec_nr_ptes(mm);
				pte_free(mm, pmd_pgtable(_pmd));
			}