hugetlb_no_page() and hugetlb_wp() call anon_vma_prepare(). In preparation for hugetlb to safely handle faults under the VMA lock, use vmf_anon_prepare() here instead. Additionally, define a struct vm_fault at the top of each function. These can later be used to convert hugetlb to use struct vm_fault - similar to mm/memory. Signed-off-by: Vishal Moola (Oracle) <vishal.moola@xxxxxxxxx> --- mm/hugetlb.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/mm/hugetlb.c b/mm/hugetlb.c index ed1581b670d4..10f57306e1f0 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -5834,9 +5834,15 @@ static vm_fault_t hugetlb_wp(struct mm_struct *mm, struct vm_area_struct *vma, struct folio *old_folio; struct folio *new_folio; int outside_reserve = 0; - vm_fault_t ret = 0; + vm_fault_t ret = 0, anon_ret = 0; unsigned long haddr = address & huge_page_mask(h); struct mmu_notifier_range range; + struct vm_fault vmf = { + .vma = vma, + .address = haddr, + .real_address = address, + .flags = flags, + }; /* * Never handle CoW for uffd-wp protected pages. It should be only @@ -5960,8 +5966,9 @@ static vm_fault_t hugetlb_wp(struct mm_struct *mm, struct vm_area_struct *vma, * When the original hugepage is shared one, it does not have * anon_vma prepared. */ - if (unlikely(anon_vma_prepare(vma))) { - ret = VM_FAULT_OOM; + anon_ret = vmf_anon_prepare(&vmf); + if (unlikely(anon_ret)) { + ret = anon_ret; goto out_release_all; } @@ -6119,7 +6126,7 @@ static vm_fault_t hugetlb_no_page(struct mm_struct *mm, pte_t old_pte, unsigned int flags) { struct hstate *h = hstate_vma(vma); - vm_fault_t ret = VM_FAULT_SIGBUS; + vm_fault_t ret = VM_FAULT_SIGBUS, anon_ret = 0; int anon_rmap = 0; unsigned long size; struct folio *folio; @@ -6128,6 +6135,12 @@ static vm_fault_t hugetlb_no_page(struct mm_struct *mm, unsigned long haddr = address & huge_page_mask(h); bool new_folio, new_pagecache_folio = false; u32 hash = hugetlb_fault_mutex_hash(mapping, idx); + struct vm_fault vmf = { + .vma = vma, + .address = haddr, + .real_address = address, + .flags = flags, + }; /* * Currently, we are forced to kill the process in the event the @@ -6221,8 +6234,10 @@ static vm_fault_t hugetlb_no_page(struct mm_struct *mm, new_pagecache_folio = true; } else { folio_lock(folio); - if (unlikely(anon_vma_prepare(vma))) { - ret = VM_FAULT_OOM; + + anon_ret = vmf_anon_prepare(&vmf); + if (unlikely(anon_ret)) { + ret = anon_ret; goto backout_unlocked; } anon_rmap = 1; -- 2.43.0