[PATCH v3 39/40] mm/huge_memory: remove vma_is_special_huge()

David Hildenbrand (Arm) david at kernel.org
Fri Oct 2 00:11:20 PDT 2026


On 9/17/26 18:22, Lorenzo Stoakes (ARM) wrote:
> vma_is_special_huge() tests whether either the VMA_PFNMAP_BIT or
> VMA_MIXEDMAP_BIT is set (i.e. whether the VMA is a kernel-owned mapping),
> but with a DAX carve-out.
> 
> DAX however no longer sets VMA_MIXEDMAP_BIT, so this carve-out is no longer
> required.
> 
> Therefore test for vma_is_kernel_owned() instead and also drop the
> VMA_IO_BIT check, as it is now redundant since it is enforced that only
> kernel-owned mappings can set this flag.
> 
> This also eliminates another overloaded use of 'special' within mm.
> 
> No functional change intended.
> 
> Signed-off-by: Lorenzo Stoakes (ARM) <ljs at kernel.org>
> ---
>  mm/huge_memory.c | 18 ++++--------------
>  1 file changed, 4 insertions(+), 14 deletions(-)
> 
> diff --git a/mm/huge_memory.c b/mm/huge_memory.c
> index c3c98ea672c3..3cb8e2d4d65c 100644
> --- a/mm/huge_memory.c
> +++ b/mm/huge_memory.c
> @@ -110,14 +110,6 @@ static inline bool file_thp_enabled(const struct vm_area_struct *vma)
>  	return S_ISREG(inode->i_mode);
>  }
>  
> -/* If returns true, we are unable to access the VMA's folios. */
> -static bool vma_is_special_huge(const struct vm_area_struct *vma)
> -{
> -	if (vma_is_dax(vma))
> -		return false;
> -	return vma_test_any(vma, VMA_PFNMAP_BIT, VMA_MIXEDMAP_BIT);
> -}
> -
>  static bool vma_file_bypass_thp_tuneables(const struct vm_area_struct *vma,
>  		enum tva_type type)
>  {
> @@ -192,7 +184,7 @@ unsigned long __thp_vma_allowable_orders(struct vm_area_struct *vma,
>  	/* Check the intersection of requested and supported orders. */
>  	if (vma_is_anonymous(vma))
>  		supported_orders = THP_ORDERS_ALL_ANON;
> -	else if (vma_is_dax(vma) || vma_is_special_huge(vma))
> +	else if (vma_is_dax(vma) || vma_is_kernel_owned(vma))
>  		supported_orders = THP_ORDERS_ALL_SPECIAL_DAX;
>  	else
>  		supported_orders = THP_ORDERS_ALL_FILE_DEFAULT;
> @@ -3066,7 +3058,7 @@ int zap_huge_pud(struct mmu_gather *tlb, struct vm_area_struct *vma,
>  	orig_pud = pudp_huge_get_and_clear_full(vma, addr, pud, tlb->fullmm);
>  	arch_check_zapped_pud(vma, orig_pud);
>  	tlb_remove_pud_tlb_entry(tlb, pud, addr);
> -	if (vma_is_special_huge(vma)) {
> +	if (vma_is_kernel_owned(vma)) {
>  		spin_unlock(ptl);
>  		/* No zero page support yet */
>  	} else {
> @@ -3222,7 +3214,7 @@ static void __split_huge_pmd_locked(struct vm_area_struct *vma, pmd_t *pmd,
>  		 */
>  		if (arch_needs_pgtable_deposit())
>  			zap_deposited_table(mm, pmd);
> -		if (vma_is_special_huge(vma))
> +		if (vma_is_kernel_owned(vma))
>  			return;
>  		if (unlikely(pmd_is_migration_entry(old_pmd))) {
>  			const softleaf_t old_entry = softleaf_from_pmd(old_pmd);
> @@ -4765,9 +4757,7 @@ static inline bool vma_not_suitable_for_thp_split(struct vm_area_struct *vma)
>  {
>  	if (vma_is_dax(vma))
>  		return true;
> -	if (vma_is_special_huge(vma))
> -		return true;
> -	if (vma_test(vma, VMA_IO_BIT))
> +	if (vma_is_kernel_owned(vma))
>  		return true;
>  	if (vma_is_hugetlb(vma))
>  		return true;
> 

So good to see that horrible shit (sorry :) ) go away.

It was too hugely special.

-- 
Cheers,

David



More information about the kvm-riscv mailing list