mm/hugetlb: convert restore_reserve_on_error to take in a folio
authorSidhartha Kumar <sidhartha.kumar@oracle.com>
Wed, 25 Jan 2023 17:05:34 +0000 (09:05 -0800)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 13 Feb 2023 23:54:29 +0000 (15:54 -0800)
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>
fs/hugetlbfs/inode.c
include/linux/hugetlb.h
mm/hugetlb.c

index f89e121..c736947 100644 (file)
@@ -873,7 +873,7 @@ static long hugetlbfs_fallocate(struct file *file, int mode, loff_t offset,
                __folio_mark_uptodate(folio);
                error = hugetlb_add_to_page_cache(&folio->page, mapping, index);
                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);
                        mutex_unlock(&hugetlb_fault_mutex_table[hash]);
                        goto out;
index 6408f85..20ceaae 100644 (file)
@@ -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,
                        pgoff_t idx);
 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 */
 int __init __alloc_bootmem_huge_page(struct hstate *h, int nid);
index ea8d461..1f6270c 100644 (file)
@@ -2802,9 +2802,9 @@ static long vma_del_reservation(struct hstate *h,
  * and the hugetlb mutex should remain held when calling this routine.
  *
  * It handles two specific cases:
- * 1) A reservation was in place and the page consumed the reservation.
- *    HPageRestoreReserve is set in the page.
- * 2) No reservation was in place for the page, so HPageRestoreReserve is
+ * 1) A reservation was in place and the folio consumed the reservation.
+ *    hugetlb_restore_reserve is set in the folio.
+ * 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.
  *
  * 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.
  */
 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);
 
        if (folio_test_hugetlb_restore_reserve(folio)) {
@@ -5102,7 +5101,7 @@ again:
                                entry = huge_ptep_get(src_pte);
                                if (!pte_same(src_pte_old, entry)) {
                                        restore_reserve_on_error(h, dst_vma, addr,
-                                                               &new_folio->page);
+                                                               new_folio);
                                        folio_put(new_folio);
                                        /* huge_ptep of dst_pte won't change as in child */
                                        goto again;
@@ -5634,7 +5633,7 @@ out_release_all:
         * unshare)
         */
        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);
 out_release_old:
        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
                                 * 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);
                                goto out;
                        }
@@ -5947,7 +5946,7 @@ backout:
        spin_unlock(ptl);
 backout_unlocked:
        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_put(folio);
@@ -6210,7 +6209,7 @@ int hugetlb_mcopy_atomic_pte(struct mm_struct *dst_mm,
                        /* Free the allocated folio which may have
                         * 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);
 
                        /* Allocate a temporary folio to hold the copied
@@ -6339,7 +6338,7 @@ out_release_unlock:
                folio_unlock(folio);
 out_release_nounlock:
        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);
        goto out;
 }