Commit 4c8763e8 authored by Ran Xiaokai's avatar Ran Xiaokai Committed by Andrew Morton
Browse files

kpageflags: detect isolated KPF_THP folios

When folio is isolated, the PG_lru bit is cleared.  So the PG_lru check in
stable_page_flags() will miss this kind of isolated folios.  Use
folio_test_large_rmappable() instead to also include isolated folios.

Since pagecache supports large folios and the introduction of mTHP, the
semantics of KPF_THP have been expanded, now it indicates not only
PMD-sized THP.  Update related documentation to clearly state that KPF_THP
indicates multiple order THPs.

[ran.xiaokai@zte.com.cn: directly use is_zero_folio(), per David]
  Link: https://lkml.kernel.org/r/20240708062601.165215-1-ranxiaokai627@163.com
Link: https://lkml.kernel.org/r/20240705104343.112680-1-ranxiaokai627@163.com


Signed-off-by: default avatarRan Xiaokai <ran.xiaokai@zte.com.cn>
Acked-by: default avatarDavid Hildenbrand <david@redhat.com>
Cc: Andrei Vagin <avagin@google.com>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Muhammad Usama Anjum <usama.anjum@collabora.com>
Cc: Ryan Roberts <ryan.roberts@arm.com>
Cc: Svetly Todorov <svetly.todorov@memverge.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Zi Yan <ziy@nvidia.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 00f58104
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -118,7 +118,7 @@ Short descriptions to the page flags
21 - KSM
    Identical memory pages dynamically shared between one or more processes.
22 - THP
    Contiguous pages which construct transparent hugepages.
    Contiguous pages which construct THP of any size and mapped by any granularity.
23 - OFFLINE
    The page is logically offline.
24 - ZERO_PAGE
@@ -231,7 +231,7 @@ Following flags about pages are currently supported:
- ``PAGE_IS_PRESENT`` - Page is present in the memory
- ``PAGE_IS_SWAPPED`` - Page is in swapped
- ``PAGE_IS_PFNZERO`` - Page has zero PFN
- ``PAGE_IS_HUGE`` - Page is THP or Hugetlb backed
- ``PAGE_IS_HUGE`` - Page is PMD-mapped THP or Hugetlb backed
- ``PAGE_IS_SOFT_DIRTY`` - Page is soft-dirty

The ``struct pm_scan_arg`` is used as the argument of the IOCTL.
+9 −12
Original line number Diff line number Diff line
@@ -147,19 +147,16 @@ u64 stable_page_flags(const struct page *page)
		u |= 1 << KPF_COMPOUND_TAIL;
	if (folio_test_hugetlb(folio))
		u |= 1 << KPF_HUGE;
	/*
	 * We need to check PageLRU/PageAnon
	 * to make sure a given page is a thp, not a non-huge compound page.
	 */
	else if (folio_test_large(folio)) {
		if ((k & (1 << PG_lru)) || is_anon)
	else if (folio_test_large(folio) &&
	         folio_test_large_rmappable(folio)) {
		/* Note: we indicate any THPs here, not just PMD-sized ones */
		u |= 1 << KPF_THP;
		else if (is_huge_zero_folio(folio)) {
	} else if (is_huge_zero_folio(folio)) {
		u |= 1 << KPF_ZERO_PAGE;
		u |= 1 << KPF_THP;
		}
	} else if (is_zero_pfn(page_to_pfn(page)))
	} else if (is_zero_folio(folio)) {
		u |= 1 << KPF_ZERO_PAGE;
	}

	/*
	 * Caveats on high order pages: PG_buddy and PG_slab will only be set