Re: [PATCH] mm/huge_memory: bypass THP tuneables for huge pfnmap mappings

From: Lance Yang

Date: Fri Aug 28 2026 - 00:47:52 EST




On 2026/8/28 03:55, Lorenzo Stoakes (ARM) wrote:
The sysfs THP tuneables at /sys/kernel/mm/transparent_huge_pages/ rather
confusingly only control the behaviour of THP in some instances.

They are not applicable to MADV_COLLAPSE operations, nor to DAX mappings.

Long-term, THP is predicated upon compaction being able to obtain large
folios to populate THP ranges.

However, vm_normal_folio() returns NULL for PFN map mappings, thus their
reference count is maintained by the driver, not core mm.

As a consequence, the folios are not subject to reclaim nor compaction, so
are not truly part of the THP mechanism at all.

However, since commit 5dd40721f147 ("mm: allow THP orders for PFNMAPs")
introduced the ability to establish huge PFN maps, they have been subject
to THP tuneables.

This is incorrect - if a huge PFN map is available (defined by
vma->vm_ops->huge_fault being non-NULL for a VMA_PFNMAP_BIT VMA), then it
should be mapped huge upon fault-in.

Correct this by explicitly checking for this while ensuring that smaps
continues to accurately report THPeligible statistics.

While here, abstract the entire file-backed THP check in
vma_can_map_huge_file(), with sensible separation of logic into helper
functions.

Note that drm_gem_shmem_mmap() and panthor_gem_mmap() establish huge PFN
maps of shmem folios, however they are marked unevictable in
drm_gem_get_pages(), and in any case would fail the reference check in
__remove_mapping() even if they weren't.

Failing to map huge PFN maps has resulted in significant real-world
performance degradation, see links for details.

Reported-by: Cedric Le Goater <clg@xxxxxxxxxx>
Closes: https://lore.kernel.org/linux-mm/20260805055544.1568534-1-clg@xxxxxxxxxx/
Reported-by: Saravanan D <saravanand@xxxxxxxxx>
Closes: https://lore.kernel.org/linux-mm/20260821070520.25759-1-saravanand@xxxxxxxxx/
Fixes: 5dd40721f147 ("mm: allow THP orders for PFNMAPs")
Cc: stable@xxxxxxxxxxxxxxx
Signed-off-by: Lorenzo Stoakes (ARM) <ljs@xxxxxxxxxx>
---

Cool!

Tested-by: Lance Yang <lance.yang@xxxxxxxxx>