mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 20:51:03 +02:00
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.com Signed-off-by: Sidhartha 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: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
committed by
Andrew Morton
parent
d0ce0e47b3
commit
d2d7bb44bf
@@ -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
|
|||||||
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);
|
||||||
|
21
mm/hugetlb.c
21
mm/hugetlb.c
@@ -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,
|
|||||||
* 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 @@ again:
|
|||||||
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 @@ out_release_all:
|
|||||||
* 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,
|
|||||||
* 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 @@ backout:
|
|||||||
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,
|
|||||||
/* 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 @@ out_release_unlock:
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user