From: Hongfu Li Replace page-level lock/ref operations with their folio equivalents in the device_private migration path of do_swap_page(). Introduce a local fault_folio to hold page_folio(vmf->page) to avoid repeated page_folio() invocations. Signed-off-by: Hongfu Li --- mm/memory.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/mm/memory.c b/mm/memory.c index d5e87624f692..bd27372a1052 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -4852,6 +4852,8 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) vmf->page = softleaf_to_page(entry); ret = remove_device_exclusive_entry(vmf); } else if (softleaf_is_device_private(entry)) { + struct folio *fault_folio; + if (vmf->flags & FAULT_FLAG_VMA_LOCK) { /* * migrate_to_ram is not yet ready to operate @@ -4863,6 +4865,7 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) } vmf->page = softleaf_to_page(entry); + fault_folio = page_folio(vmf->page); vmf->pte = pte_offset_map_lock(vma->vm_mm, vmf->pmd, vmf->address, &vmf->ptl); if (unlikely(!vmf->pte || @@ -4874,15 +4877,15 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) * Get a page reference while we know the page can't be * freed. */ - if (trylock_page(vmf->page)) { + if (folio_trylock(fault_folio)) { struct dev_pagemap *pgmap; - get_page(vmf->page); + folio_get(fault_folio); pte_unmap_unlock(vmf->pte, vmf->ptl); pgmap = page_pgmap(vmf->page); ret = pgmap->ops->migrate_to_ram(vmf); - unlock_page(vmf->page); - put_page(vmf->page); + folio_unlock(fault_folio); + folio_put(fault_folio); } else { pte_unmap(vmf->pte); softleaf_entry_wait_on_locked(entry, vmf->ptl); -- 2.54.0