Commit d4111eec authored by Matthew Wilcox (Oracle)'s avatar Matthew Wilcox (Oracle) Committed by Andrew Morton

mm: use a folio in __collapse_huge_page_copy_succeeded()

These pages are all chained together through the lru list, so we know
they're folios.  Use the folio APIs to save three hidden calls to
compound_head().

Link: https://lkml.kernel.org/r/20240227174254.710559-18-willy@infradead.orgSigned-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
Cc: David Hildenbrand <david@redhat.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Ryan Roberts <ryan.roberts@arm.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 4907e80b
...@@ -689,9 +689,7 @@ static void __collapse_huge_page_copy_succeeded(pte_t *pte, ...@@ -689,9 +689,7 @@ static void __collapse_huge_page_copy_succeeded(pte_t *pte,
spinlock_t *ptl, spinlock_t *ptl,
struct list_head *compound_pagelist) struct list_head *compound_pagelist)
{ {
struct folio *src_folio; struct folio *src, *tmp;
struct page *src_page;
struct page *tmp;
pte_t *_pte; pte_t *_pte;
pte_t pteval; pte_t pteval;
...@@ -710,10 +708,11 @@ static void __collapse_huge_page_copy_succeeded(pte_t *pte, ...@@ -710,10 +708,11 @@ static void __collapse_huge_page_copy_succeeded(pte_t *pte,
ksm_might_unmap_zero_page(vma->vm_mm, pteval); ksm_might_unmap_zero_page(vma->vm_mm, pteval);
} }
} else { } else {
src_page = pte_page(pteval); struct page *src_page = pte_page(pteval);
src_folio = page_folio(src_page);
if (!folio_test_large(src_folio)) src = page_folio(src_page);
release_pte_folio(src_folio); if (!folio_test_large(src))
release_pte_folio(src);
/* /*
* ptl mostly unnecessary, but preempt has to * ptl mostly unnecessary, but preempt has to
* be disabled to update the per-cpu stats * be disabled to update the per-cpu stats
...@@ -721,20 +720,19 @@ static void __collapse_huge_page_copy_succeeded(pte_t *pte, ...@@ -721,20 +720,19 @@ static void __collapse_huge_page_copy_succeeded(pte_t *pte,
*/ */
spin_lock(ptl); spin_lock(ptl);
ptep_clear(vma->vm_mm, address, _pte); ptep_clear(vma->vm_mm, address, _pte);
folio_remove_rmap_pte(src_folio, src_page, vma); folio_remove_rmap_pte(src, src_page, vma);
spin_unlock(ptl); spin_unlock(ptl);
free_page_and_swap_cache(src_page); free_page_and_swap_cache(src_page);
} }
} }
list_for_each_entry_safe(src_page, tmp, compound_pagelist, lru) { list_for_each_entry_safe(src, tmp, compound_pagelist, lru) {
list_del(&src_page->lru); list_del(&src->lru);
mod_node_page_state(page_pgdat(src_page), node_stat_sub_folio(src, NR_ISOLATED_ANON +
NR_ISOLATED_ANON + page_is_file_lru(src_page), folio_is_file_lru(src));
-compound_nr(src_page)); folio_unlock(src);
unlock_page(src_page); free_swap_cache(&src->page);
free_swap_cache(src_page); folio_putback_lru(src);
putback_lru_page(src_page);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment