]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
mm: khugepaged: use the number of pages in the folio to check the reference count
authorBaolin Wang <baolin.wang@linux.alibaba.com>
Tue, 20 Aug 2024 09:49:14 +0000 (17:49 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Wed, 4 Sep 2024 04:15:39 +0000 (21:15 -0700)
Use the number of pages in the folio to check the reference count as
preparation for supporting shmem mTHP collapse.

Link: https://lkml.kernel.org/r/9ea49262308de28957596cc6e8edc2d3a4f54659.1724140601.git.baolin.wang@linux.alibaba.com
Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com>
Acked-by: David Hildenbrand <david@redhat.com>
Cc: Barry Song <21cnbao@gmail.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Ryan Roberts <ryan.roberts@arm.com>
Cc: Yang Shi <shy828301@gmail.com>
Cc: Zi Yan <ziy@nvidia.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/khugepaged.c

index 76f05215ee87ea9297ff6eac3ff6b9c5a30d9381..e015c94eba09d3e25fa3390028475f87196336fa 100644 (file)
@@ -1988,9 +1988,9 @@ static int collapse_file(struct mm_struct *mm, unsigned long addr,
                VM_BUG_ON_FOLIO(folio != xa_load(xas.xa, index), folio);
 
                /*
-                * We control three references to the folio:
+                * We control 2 + nr_pages references to the folio:
                 *  - we hold a pin on it;
-                *  - one reference from page cache;
+                *  - nr_pages reference from page cache;
                 *  - one from lru_isolate_folio;
                 * If those are the only references, then any new usage
                 * of the folio will have to fetch it from the page
@@ -1998,7 +1998,7 @@ static int collapse_file(struct mm_struct *mm, unsigned long addr,
                 * truncate, so any new usage will be blocked until we
                 * unlock folio after collapse/during rollback.
                 */
-               if (folio_ref_count(folio) != 3) {
+               if (folio_ref_count(folio) != 2 + folio_nr_pages(folio)) {
                        result = SCAN_PAGE_COUNT;
                        xas_unlock_irq(&xas);
                        folio_putback_lru(folio);
@@ -2181,7 +2181,7 @@ immap_locked:
                folio_clear_active(folio);
                folio_clear_unevictable(folio);
                folio_unlock(folio);
-               folio_put_refs(folio, 3);
+               folio_put_refs(folio, 2 + folio_nr_pages(folio));
        }
 
        goto out;