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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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






[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux