Commit d2d7bb44 authored by Sidhartha Kumar's avatar Sidhartha Kumar Committed by Andrew Morton

mm/hugetlb: convert restore_reserve_on_error to take in a folio

Every caller of restore_reserve_on_error() is now passing in &folio->page,
change the function to take in a folio directly and clean up the call
sites.

Link: https://lkml.kernel.org/r/20230125170537.96973-6-sidhartha.kumar@oracle.comSigned-off-by: default avatarSidhartha Kumar <sidhartha.kumar@oracle.com>
Cc: Gerald Schaefer <gerald.schaefer@linux.ibm.com>
Cc: John Hubbard <jhubbard@nvidia.com>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Mike Kravetz <mike.kravetz@oracle.com>
Cc: Muchun Song <songmuchun@bytedance.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent d0ce0e47
...@@ -873,7 +873,7 @@ static long hugetlbfs_fallocate(struct file *file, int mode, loff_t offset, ...@@ -873,7 +873,7 @@ static long hugetlbfs_fallocate(struct file *file, int mode, loff_t offset,
__folio_mark_uptodate(folio); __folio_mark_uptodate(folio);
error = hugetlb_add_to_page_cache(&folio->page, mapping, index); error = hugetlb_add_to_page_cache(&folio->page, mapping, index);
if (unlikely(error)) { if (unlikely(error)) {
restore_reserve_on_error(h, &pseudo_vma, addr, &folio->page); restore_reserve_on_error(h, &pseudo_vma, addr, folio);
folio_put(folio); folio_put(folio);
mutex_unlock(&hugetlb_fault_mutex_table[hash]); mutex_unlock(&hugetlb_fault_mutex_table[hash]);
goto out; goto out;
......
...@@ -726,7 +726,7 @@ struct folio *alloc_hugetlb_folio_vma(struct hstate *h, struct vm_area_struct *v ...@@ -726,7 +726,7 @@ struct folio *alloc_hugetlb_folio_vma(struct hstate *h, struct vm_area_struct *v
int hugetlb_add_to_page_cache(struct page *page, struct address_space *mapping, int hugetlb_add_to_page_cache(struct page *page, struct address_space *mapping,
pgoff_t idx); pgoff_t idx);
void restore_reserve_on_error(struct hstate *h, struct vm_area_struct *vma, void restore_reserve_on_error(struct hstate *h, struct vm_area_struct *vma,
unsigned long address, struct page *page); unsigned long address, struct folio *folio);
/* arch callback */ /* arch callback */
int __init __alloc_bootmem_huge_page(struct hstate *h, int nid); int __init __alloc_bootmem_huge_page(struct hstate *h, int nid);
......
...@@ -2802,9 +2802,9 @@ static long vma_del_reservation(struct hstate *h, ...@@ -2802,9 +2802,9 @@ static long vma_del_reservation(struct hstate *h,
* and the hugetlb mutex should remain held when calling this routine. * and the hugetlb mutex should remain held when calling this routine.
* *
* It handles two specific cases: * It handles two specific cases:
* 1) A reservation was in place and the page consumed the reservation. * 1) A reservation was in place and the folio consumed the reservation.
* HPageRestoreReserve is set in the page. * hugetlb_restore_reserve is set in the folio.
* 2) No reservation was in place for the page, so HPageRestoreReserve is * 2) No reservation was in place for the page, so hugetlb_restore_reserve is
* not set. However, alloc_hugetlb_folio always updates the reserve map. * not set. However, alloc_hugetlb_folio always updates the reserve map.
* *
* In case 1, free_huge_page later in the error path will increment the * In case 1, free_huge_page later in the error path will increment the
...@@ -2817,9 +2817,8 @@ static long vma_del_reservation(struct hstate *h, ...@@ -2817,9 +2817,8 @@ static long vma_del_reservation(struct hstate *h,
* In case 2, simply undo reserve map modifications done by alloc_hugetlb_folio. * In case 2, simply undo reserve map modifications done by alloc_hugetlb_folio.
*/ */
void restore_reserve_on_error(struct hstate *h, struct vm_area_struct *vma, void restore_reserve_on_error(struct hstate *h, struct vm_area_struct *vma,
unsigned long address, struct page *page) unsigned long address, struct folio *folio)
{ {
struct folio *folio = page_folio(page);
long rc = vma_needs_reservation(h, vma, address); long rc = vma_needs_reservation(h, vma, address);
if (folio_test_hugetlb_restore_reserve(folio)) { if (folio_test_hugetlb_restore_reserve(folio)) {
...@@ -5102,7 +5101,7 @@ int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src, ...@@ -5102,7 +5101,7 @@ int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src,
entry = huge_ptep_get(src_pte); entry = huge_ptep_get(src_pte);
if (!pte_same(src_pte_old, entry)) { if (!pte_same(src_pte_old, entry)) {
restore_reserve_on_error(h, dst_vma, addr, restore_reserve_on_error(h, dst_vma, addr,
&new_folio->page); new_folio);
folio_put(new_folio); folio_put(new_folio);
/* huge_ptep of dst_pte won't change as in child */ /* huge_ptep of dst_pte won't change as in child */
goto again; goto again;
...@@ -5634,7 +5633,7 @@ static vm_fault_t hugetlb_wp(struct mm_struct *mm, struct vm_area_struct *vma, ...@@ -5634,7 +5633,7 @@ static vm_fault_t hugetlb_wp(struct mm_struct *mm, struct vm_area_struct *vma,
* unshare) * unshare)
*/ */
if (new_folio != page_folio(old_page)) if (new_folio != page_folio(old_page))
restore_reserve_on_error(h, vma, haddr, &new_folio->page); restore_reserve_on_error(h, vma, haddr, new_folio);
folio_put(new_folio); folio_put(new_folio);
out_release_old: out_release_old:
put_page(old_page); put_page(old_page);
...@@ -5846,7 +5845,7 @@ static vm_fault_t hugetlb_no_page(struct mm_struct *mm, ...@@ -5846,7 +5845,7 @@ static vm_fault_t hugetlb_no_page(struct mm_struct *mm,
* to the page cache. So it's safe to call * to the page cache. So it's safe to call
* restore_reserve_on_error() here. * restore_reserve_on_error() here.
*/ */
restore_reserve_on_error(h, vma, haddr, &folio->page); restore_reserve_on_error(h, vma, haddr, folio);
folio_put(folio); folio_put(folio);
goto out; goto out;
} }
...@@ -5947,7 +5946,7 @@ static vm_fault_t hugetlb_no_page(struct mm_struct *mm, ...@@ -5947,7 +5946,7 @@ static vm_fault_t hugetlb_no_page(struct mm_struct *mm,
spin_unlock(ptl); spin_unlock(ptl);
backout_unlocked: backout_unlocked:
if (new_folio && !new_pagecache_folio) if (new_folio && !new_pagecache_folio)
restore_reserve_on_error(h, vma, haddr, &folio->page); restore_reserve_on_error(h, vma, haddr, folio);
folio_unlock(folio); folio_unlock(folio);
folio_put(folio); folio_put(folio);
...@@ -6210,7 +6209,7 @@ int hugetlb_mcopy_atomic_pte(struct mm_struct *dst_mm, ...@@ -6210,7 +6209,7 @@ int hugetlb_mcopy_atomic_pte(struct mm_struct *dst_mm,
/* Free the allocated folio which may have /* Free the allocated folio which may have
* consumed a reservation. * consumed a reservation.
*/ */
restore_reserve_on_error(h, dst_vma, dst_addr, &folio->page); restore_reserve_on_error(h, dst_vma, dst_addr, folio);
folio_put(folio); folio_put(folio);
/* Allocate a temporary folio to hold the copied /* Allocate a temporary folio to hold the copied
...@@ -6339,7 +6338,7 @@ int hugetlb_mcopy_atomic_pte(struct mm_struct *dst_mm, ...@@ -6339,7 +6338,7 @@ int hugetlb_mcopy_atomic_pte(struct mm_struct *dst_mm,
folio_unlock(folio); folio_unlock(folio);
out_release_nounlock: out_release_nounlock:
if (!folio_in_pagecache) if (!folio_in_pagecache)
restore_reserve_on_error(h, dst_vma, dst_addr, &folio->page); restore_reserve_on_error(h, dst_vma, dst_addr, folio);
folio_put(folio); folio_put(folio);
goto out; goto out;
} }
......
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