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

khugepaged: pass a folio to __collapse_huge_page_copy()

Simplify the body of __collapse_huge_page_copy() while I'm looking at
it.

Link: https://lkml.kernel.org/r/20240403171838.1445826-5-willy@infradead.orgSigned-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: default avatarVishal Moola (Oracle) <vishal.moola@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 02347792
...@@ -767,7 +767,7 @@ static void __collapse_huge_page_copy_failed(pte_t *pte, ...@@ -767,7 +767,7 @@ static void __collapse_huge_page_copy_failed(pte_t *pte,
* Returns SCAN_SUCCEED if copying succeeds, otherwise returns SCAN_COPY_MC. * Returns SCAN_SUCCEED if copying succeeds, otherwise returns SCAN_COPY_MC.
* *
* @pte: starting of the PTEs to copy from * @pte: starting of the PTEs to copy from
* @page: the new hugepage to copy contents to * @folio: the new hugepage to copy contents to
* @pmd: pointer to the new hugepage's PMD * @pmd: pointer to the new hugepage's PMD
* @orig_pmd: the original raw pages' PMD * @orig_pmd: the original raw pages' PMD
* @vma: the original raw pages' virtual memory area * @vma: the original raw pages' virtual memory area
...@@ -775,33 +775,29 @@ static void __collapse_huge_page_copy_failed(pte_t *pte, ...@@ -775,33 +775,29 @@ static void __collapse_huge_page_copy_failed(pte_t *pte,
* @ptl: lock on raw pages' PTEs * @ptl: lock on raw pages' PTEs
* @compound_pagelist: list that stores compound pages * @compound_pagelist: list that stores compound pages
*/ */
static int __collapse_huge_page_copy(pte_t *pte, static int __collapse_huge_page_copy(pte_t *pte, struct folio *folio,
struct page *page, pmd_t *pmd, pmd_t orig_pmd, struct vm_area_struct *vma,
pmd_t *pmd, unsigned long address, spinlock_t *ptl,
pmd_t orig_pmd, struct list_head *compound_pagelist)
struct vm_area_struct *vma,
unsigned long address,
spinlock_t *ptl,
struct list_head *compound_pagelist)
{ {
struct page *src_page; unsigned int i;
pte_t *_pte;
pte_t pteval;
unsigned long _address;
int result = SCAN_SUCCEED; int result = SCAN_SUCCEED;
/* /*
* Copying pages' contents is subject to memory poison at any iteration. * Copying pages' contents is subject to memory poison at any iteration.
*/ */
for (_pte = pte, _address = address; _pte < pte + HPAGE_PMD_NR; for (i = 0; i < HPAGE_PMD_NR; i++) {
_pte++, page++, _address += PAGE_SIZE) { pte_t pteval = ptep_get(pte + i);
pteval = ptep_get(_pte); struct page *page = folio_page(folio, i);
unsigned long src_addr = address + i * PAGE_SIZE;
struct page *src_page;
if (pte_none(pteval) || is_zero_pfn(pte_pfn(pteval))) { if (pte_none(pteval) || is_zero_pfn(pte_pfn(pteval))) {
clear_user_highpage(page, _address); clear_user_highpage(page, src_addr);
continue; continue;
} }
src_page = pte_page(pteval); src_page = pte_page(pteval);
if (copy_mc_user_highpage(page, src_page, _address, vma) > 0) { if (copy_mc_user_highpage(page, src_page, src_addr, vma) > 0) {
result = SCAN_COPY_MC; result = SCAN_COPY_MC;
break; break;
} }
...@@ -1196,7 +1192,7 @@ static int collapse_huge_page(struct mm_struct *mm, unsigned long address, ...@@ -1196,7 +1192,7 @@ static int collapse_huge_page(struct mm_struct *mm, unsigned long address,
*/ */
anon_vma_unlock_write(vma->anon_vma); anon_vma_unlock_write(vma->anon_vma);
result = __collapse_huge_page_copy(pte, &folio->page, pmd, _pmd, result = __collapse_huge_page_copy(pte, folio, pmd, _pmd,
vma, address, pte_ptl, vma, address, pte_ptl,
&compound_pagelist); &compound_pagelist);
pte_unmap(pte); pte_unmap(pte);
......
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