static vm_fault_t do_cow_fault(struct vm_fault *vmf)
 {
        struct vm_area_struct *vma = vmf->vma;
+       struct folio *folio;
        vm_fault_t ret;
 
        ret = vmf_can_call_fault(vmf);
        if (ret)
                return ret;
 
-       vmf->cow_page = alloc_page_vma(GFP_HIGHUSER_MOVABLE, vma, vmf->address);
-       if (!vmf->cow_page)
+       folio = folio_prealloc(vma->vm_mm, vma, vmf->address, false);
+       if (!folio)
                return VM_FAULT_OOM;
 
-       if (mem_cgroup_charge(page_folio(vmf->cow_page), vma->vm_mm,
-                               GFP_KERNEL)) {
-               put_page(vmf->cow_page);
-               return VM_FAULT_OOM;
-       }
-       folio_throttle_swaprate(page_folio(vmf->cow_page), GFP_KERNEL);
+       vmf->cow_page = &folio->page;
 
        ret = __do_fault(vmf);
        if (unlikely(ret & (VM_FAULT_ERROR | VM_FAULT_NOPAGE | VM_FAULT_RETRY)))
                return ret;
 
        copy_user_highpage(vmf->cow_page, vmf->page, vmf->address, vma);
-       __SetPageUptodate(vmf->cow_page);
+       __folio_mark_uptodate(folio);
 
        ret |= finish_fault(vmf);
        unlock_page(vmf->page);
                goto uncharge_out;
        return ret;
 uncharge_out:
-       put_page(vmf->cow_page);
+       folio_put(folio);
        return ret;
 }