Re: [PATCH v2 18/20] fs/proc/task_mmu: remove per-page mapcount dependency for "mapmax" (CONFIG_NO_PAGE_MAPCOUNT)

From: Zi Yan
Date: Mon Feb 24 2025 - 15:46:14 EST


On Mon Feb 24, 2025 at 11:56 AM EST, David Hildenbrand wrote:
> Let's implement an alternative when per-page mapcounts in large folios are
> no longer maintained -- soon with CONFIG_NO_PAGE_MAPCOUNT.
>
> For calculating "mapmax", we now use the average per-page mapcount in
> a large folio instead of the per-page mapcount.
>
> For hugetlb folios and folios that are not partially mapped into MMs,
> there is no change.
>
> Likely, this change will not matter much in practice, and an alternative
> might be to simple remove this stat with CONFIG_NO_PAGE_MAPCOUNT.
> However, there might be value to it, so let's keep it like that and
> document the behavior.
>
> Signed-off-by: David Hildenbrand <david@xxxxxxxxxx>
> ---
> Documentation/filesystems/proc.rst | 5 +++++
> fs/proc/task_mmu.c | 7 ++++++-
> 2 files changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/filesystems/proc.rst b/Documentation/filesystems/proc.rst
> index 09f0aed5a08ba..1aa190017f796 100644
> --- a/Documentation/filesystems/proc.rst
> +++ b/Documentation/filesystems/proc.rst
> @@ -686,6 +686,11 @@ Where:
> node locality page counters (N0 == node0, N1 == node1, ...) and the kernel page
> size, in KB, that is backing the mapping up.
>
> +Note that 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, "mapmax" might corresponds to the average number of mappings
> +per page in such a larger allocation instead.
> +
> 1.2 Kernel data
> ---------------
>
> diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
> index 80839bbf9657f..d7ee842367f0f 100644
> --- a/fs/proc/task_mmu.c
> +++ b/fs/proc/task_mmu.c
> @@ -2862,7 +2862,12 @@ static void gather_stats(struct page *page, struct numa_maps *md, int pte_dirty,
> unsigned long nr_pages)
> {
> struct folio *folio = page_folio(page);
> - int count = folio_precise_page_mapcount(folio, page);
> + int count;
> +
> + if (IS_ENABLED(CONFIG_PAGE_MAPCOUNT))
> + count = folio_precise_page_mapcount(folio, page);
> + else
> + count = min_t(int, folio_average_page_mapcount(folio), 1);

s/min/max ?

Otherwise, count is at most 1. Anyway, if you change
folio_average_page_mapcount() as I indicated in patch 16, this
will become count = folio_average_page_mapcount(folio).

>
> md->pages += nr_pages;
> if (pte_dirty || folio_test_dirty(folio))




--
Best Regards,
Yan, Zi