On Wed, Oct 21, 2026 at 10:36:00PM +0200, Konstantin Khorenko wrote:
> folio_dup_file_rmap_pmd() passes PGTABLE_LEVEL_PTE to
> __folio_dup_file_rmap() for HPAGE_PMD_NR pages, so it adds HPAGE_PMD_NR
> PTE mappings to the folio instead of one PMD mapping. Each unmap of the
> PMD removes one PMD mapping:
>
> - the folio's mapcount never returns to zero, and removing the folio
>   from the page cache reports "Bad page cache", or hits a VM_BUG_ON
>   with CONFIG_DEBUG_VM;
> - the first unmap already counts as the last one and drops the
>   PMD-mapped statistics while the other mm still maps the folio;
> - the second one drives the entire mapcount below zero and drops them
>   again.
>
> The helper has no caller yet, the next patch adds the first one. Pass
> PGTABLE_LEVEL_PMD, as folio_try_dup_anon_rmap_pmd() does.
>
> Fixes: d8ef5e311d7b ("mm/rmap: convert page_dup_file_rmap() to 
> folio_dup_file_rmap_[pte|ptes|pmd]()")

Was this a mistake in d8ef5e311d7b, or actually intentional for whatever reason?
If the latter this shouldn't be a fixes.

> Signed-off-by: Konstantin Khorenko <[email protected]>
> ---
>  include/linux/rmap.h | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/include/linux/rmap.h b/include/linux/rmap.h
> index 0b332770abeed..7562017416094 100644
> --- a/include/linux/rmap.h
> +++ b/include/linux/rmap.h
> @@ -558,7 +558,7 @@ static inline void folio_dup_file_rmap_pmd(struct folio 
> *folio,
>               struct page *page, struct vm_area_struct *dst_vma)
>  {
>  #ifdef CONFIG_TRANSPARENT_HUGEPAGE
> -     __folio_dup_file_rmap(folio, page, HPAGE_PMD_NR, dst_vma, 
> PGTABLE_LEVEL_PTE);
> +     __folio_dup_file_rmap(folio, page, HPAGE_PMD_NR, dst_vma, 
> PGTABLE_LEVEL_PMD);
>  #else
>       WARN_ON_ONCE(true);
>  #endif
>
> --
> 2.43.0
>

--
Cheers, Lorenzo

Reply via email to