[PATCH RFC 03/13] fs/proc/page: remove CONFIG_PAGE_MAPCOUNT handling for kpagecount

David Hildenbrand (Arm)
2026-04-12T19:00:21Z

In preparation for removing CONFIG_PAGE_MAPCOUNT, let's always use a
folio's average page mapcount instead of the precise page mapcount when
calculating the kpagecount value, like we do with CONFIG_NO_PAGE_MAPCOUNT.

Update the doc to state that this behavior no longer depends on the
kernel config. While at it, improve the documentation a bit. "pagecount"
was really misnamed back in the days ...

Should we mention that the value is not actually really expressive in many
cases, such as for the shared zeropage or pages with a PFNMAP mapping?
Let's keep it simple, the hope is that this interface is not used at
all anymore, except for some weird debugging scenarios.

For small folios, or large folios that are fully-mapped everywhere, there
is no change at all.

Signed-off-by: David Hildenbrand (Arm) <david@kernel.org>
---
Documentation/admin-guide/mm/pagemap.rst | 13 ++++++-------
fs/proc/page.c | 10 +---------
2 files changed, 7 insertions(+), 16 deletions(-)

diff --git a/Documentation/admin-guide/mm/pagemap.rst b/Documentation/admin-guide/mm/pagemap.rst
index c57e61b5d8aa..f9478bcbb6a9 100644
--- a/Documentation/admin-guide/mm/pagemap.rst
+++ b/Documentation/admin-guide/mm/pagemap.rst
@@ -53,13 +53,12 @@ There are four components to pagemap:
determine which areas of memory are actually mapped and llseek to
skip over unmapped regions.

- * ``/proc/kpagecount``. This file contains a 64-bit count of the number of
- times each page is mapped, indexed by PFN. Some kernel configurations do
- not track the precise number of times a page part of a larger allocation
- (e.g., THP) is mapped. In these configurations, the average number of
- mappings per page in this larger allocation is returned instead. However,
- if any page of the large allocation is mapped, the returned value will
- be at least 1.
+ * ``/proc/kpagecount``. This file contains a 64-bit value for each page,
+ indexed by PFN, representing its mapcount, i.e., the number of times it
+ is mapped into page tables. For pages that are part of larger allocations
+ (e.g., THP), the average mapcount per page in the allocation is used, since
+ precise per-page mapcounts are not available. If any page in such an
+ allocation is mapped, the returned value will be at least 1.

The page-types tool in the tools/mm directory can be used to query the
number of times a page is mapped.
diff --git a/fs/proc/page.c b/fs/proc/page.c
index f9b2c2c906cd..bc4d7c3751de 100644
--- a/fs/proc/page.c
+++ b/fs/proc/page.c
@@ -45,17 +45,9 @@ static inline unsigned long get_max_dump_pfn(void)
static u64 get_kpage_count(const struct page *page)
{
struct page_snapshot ps;
- u64 ret;

snapshot_page(&ps, page);
-
- if (IS_ENABLED(CONFIG_PAGE_MAPCOUNT))
- ret = folio_precise_page_mapcount(&ps.folio_snapshot,
- &ps.page_snapshot);
- else
- ret = folio_average_page_mapcount(&ps.folio_snapshot);
-
- return ret;
+ return folio_average_page_mapcount(&ps.folio_snapshot);
}

static ssize_t kpage_read(struct file *file, char __user *buf,

--
2.43.0