[RFC 07/10] treewide: rename has_transparent_hugepage() to arch_has_pmd_leaves()

Luiz Capitulino posted 10 patches 1 month, 1 week ago
There is a newer version of this series
[RFC 07/10] treewide: rename has_transparent_hugepage() to arch_has_pmd_leaves()
Posted by Luiz Capitulino 1 month, 1 week ago
Now that the majority of has_transparent_hugepage() callers have been
converted to pgtable_has_pmd_leaves(), rename has_transparent_hugepage()
to arch_has_pmd_leaves() since that's what the helper checks for.

arch_has_pmd_leaves() is supposed to be called only by
init_arch_has_pmd_leaves(), except for two exeptions:

1. shmem: shmem code runs very early during boot so it can't use
   pgtable_has_pmd_leaves()
2. hugepage_init(): just a temporary exception, this function will be
   converted in a future commit

Signed-off-by: Luiz Capitulino <luizcap@redhat.com>
---
 arch/mips/include/asm/pgtable.h               |  4 ++--
 arch/mips/mm/tlb-r4k.c                        |  4 ++--
 arch/powerpc/include/asm/book3s/64/hash-4k.h  |  2 +-
 arch/powerpc/include/asm/book3s/64/hash-64k.h |  2 +-
 arch/powerpc/include/asm/book3s/64/pgtable.h  | 10 +++++-----
 arch/powerpc/include/asm/book3s/64/radix.h    |  2 +-
 arch/powerpc/mm/book3s64/hash_pgtable.c       |  4 ++--
 arch/s390/include/asm/pgtable.h               |  4 ++--
 arch/x86/include/asm/pgtable.h                |  4 ++--
 include/linux/pgtable.h                       |  4 ++--
 mm/huge_memory.c                              |  2 +-
 mm/memory.c                                   |  2 +-
 mm/shmem.c                                    |  6 +++---
 13 files changed, 25 insertions(+), 25 deletions(-)

diff --git a/arch/mips/include/asm/pgtable.h b/arch/mips/include/asm/pgtable.h
index ae73ecf4c41a..fb9539002392 100644
--- a/arch/mips/include/asm/pgtable.h
+++ b/arch/mips/include/asm/pgtable.h
@@ -616,8 +616,8 @@ int io_remap_pfn_range(struct vm_area_struct *vma, unsigned long vaddr,
 /* We don't have hardware dirty/accessed bits, generic_pmdp_establish is fine.*/
 #define pmdp_establish generic_pmdp_establish
 
-#define has_transparent_hugepage has_transparent_hugepage
-extern int has_transparent_hugepage(void);
+#define arch_has_pmd_leaves arch_has_pmd_leaves
+extern int arch_has_pmd_leaves(void);
 
 static inline int pmd_trans_huge(pmd_t pmd)
 {
diff --git a/arch/mips/mm/tlb-r4k.c b/arch/mips/mm/tlb-r4k.c
index 347126dc010d..eb16ddedb40c 100644
--- a/arch/mips/mm/tlb-r4k.c
+++ b/arch/mips/mm/tlb-r4k.c
@@ -430,7 +430,7 @@ void add_wired_entry(unsigned long entrylo0, unsigned long entrylo1,
 
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
 
-int has_transparent_hugepage(void)
+int arch_has_pmd_leaves(void)
 {
 	static unsigned int mask = -1;
 
@@ -446,7 +446,7 @@ int has_transparent_hugepage(void)
 	}
 	return mask == PM_HUGE_MASK;
 }
-EXPORT_SYMBOL(has_transparent_hugepage);
+EXPORT_SYMBOL(arch_has_pmd_leaves);
 
 #endif /* CONFIG_TRANSPARENT_HUGEPAGE  */
 
diff --git a/arch/powerpc/include/asm/book3s/64/hash-4k.h b/arch/powerpc/include/asm/book3s/64/hash-4k.h
index 8e5bd9902bed..6744c2287199 100644
--- a/arch/powerpc/include/asm/book3s/64/hash-4k.h
+++ b/arch/powerpc/include/asm/book3s/64/hash-4k.h
@@ -165,7 +165,7 @@ extern void hash__pgtable_trans_huge_deposit(struct mm_struct *mm, pmd_t *pmdp,
 extern pgtable_t hash__pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp);
 extern pmd_t hash__pmdp_huge_get_and_clear(struct mm_struct *mm,
 				       unsigned long addr, pmd_t *pmdp);
-extern int hash__has_transparent_hugepage(void);
+extern int hash__arch_has_pmd_leaves(void);
 #endif
 
 #endif /* !__ASSEMBLER__ */
diff --git a/arch/powerpc/include/asm/book3s/64/hash-64k.h b/arch/powerpc/include/asm/book3s/64/hash-64k.h
index 7deb3a66890b..9392aba5e5dc 100644
--- a/arch/powerpc/include/asm/book3s/64/hash-64k.h
+++ b/arch/powerpc/include/asm/book3s/64/hash-64k.h
@@ -278,7 +278,7 @@ extern void hash__pgtable_trans_huge_deposit(struct mm_struct *mm, pmd_t *pmdp,
 extern pgtable_t hash__pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp);
 extern pmd_t hash__pmdp_huge_get_and_clear(struct mm_struct *mm,
 				       unsigned long addr, pmd_t *pmdp);
-extern int hash__has_transparent_hugepage(void);
+extern int hash__arch_has_pmd_leaves(void);
 #endif /*  CONFIG_TRANSPARENT_HUGEPAGE */
 
 #endif	/* __ASSEMBLER__ */
diff --git a/arch/powerpc/include/asm/book3s/64/pgtable.h b/arch/powerpc/include/asm/book3s/64/pgtable.h
index aac8ce30cd3b..6ed036b3d3c2 100644
--- a/arch/powerpc/include/asm/book3s/64/pgtable.h
+++ b/arch/powerpc/include/asm/book3s/64/pgtable.h
@@ -1094,14 +1094,14 @@ static inline void update_mmu_cache_pud(struct vm_area_struct *vma,
 {
 }
 
-extern int hash__has_transparent_hugepage(void);
-static inline int has_transparent_hugepage(void)
+extern int hash__arch_has_pmd_leaves(void);
+static inline int arch_has_pmd_leaves(void)
 {
 	if (radix_enabled())
-		return radix__has_transparent_hugepage();
-	return hash__has_transparent_hugepage();
+		return radix__arch_has_pmd_leaves();
+	return hash__arch_has_pmd_leaves();
 }
-#define has_transparent_hugepage has_transparent_hugepage
+#define arch_has_pmd_leaves arch_has_pmd_leaves
 
 static inline int has_transparent_pud_hugepage(void)
 {
diff --git a/arch/powerpc/include/asm/book3s/64/radix.h b/arch/powerpc/include/asm/book3s/64/radix.h
index da954e779744..c884a119cbd9 100644
--- a/arch/powerpc/include/asm/book3s/64/radix.h
+++ b/arch/powerpc/include/asm/book3s/64/radix.h
@@ -298,7 +298,7 @@ extern pmd_t radix__pmdp_huge_get_and_clear(struct mm_struct *mm,
 pud_t radix__pudp_huge_get_and_clear(struct mm_struct *mm,
 				     unsigned long addr, pud_t *pudp);
 
-static inline int radix__has_transparent_hugepage(void)
+static inline int radix__arch_has_pmd_leaves(void)
 {
 	/* For radix 2M at PMD level means thp */
 	if (mmu_psize_defs[MMU_PAGE_2M].shift == PMD_SHIFT)
diff --git a/arch/powerpc/mm/book3s64/hash_pgtable.c b/arch/powerpc/mm/book3s64/hash_pgtable.c
index 82d31177630b..1dec64bf0c75 100644
--- a/arch/powerpc/mm/book3s64/hash_pgtable.c
+++ b/arch/powerpc/mm/book3s64/hash_pgtable.c
@@ -366,7 +366,7 @@ pmd_t hash__pmdp_huge_get_and_clear(struct mm_struct *mm,
 	return old_pmd;
 }
 
-int hash__has_transparent_hugepage(void)
+int hash__arch_has_pmd_leaves(void)
 {
 
 	if (!mmu_has_feature(MMU_FTR_16M_PAGE))
@@ -395,7 +395,7 @@ int hash__has_transparent_hugepage(void)
 
 	return 1;
 }
-EXPORT_SYMBOL_GPL(hash__has_transparent_hugepage);
+EXPORT_SYMBOL_GPL(hash__arch_has_pmd_leaves);
 
 #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
 
diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h
index b7100c6a4054..68fe444ace56 100644
--- a/arch/s390/include/asm/pgtable.h
+++ b/arch/s390/include/asm/pgtable.h
@@ -1881,8 +1881,8 @@ static inline int pmd_trans_huge(pmd_t pmd)
 	return pmd_leaf(pmd);
 }
 
-#define has_transparent_hugepage has_transparent_hugepage
-static inline int has_transparent_hugepage(void)
+#define arch_has_pmd_leaves arch_has_pmd_leaves
+static inline int arch_has_pmd_leaves(void)
 {
 	return cpu_has_edat1() ? 1 : 0;
 }
diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h
index e33df3da6980..08d109280e36 100644
--- a/arch/x86/include/asm/pgtable.h
+++ b/arch/x86/include/asm/pgtable.h
@@ -313,8 +313,8 @@ static inline int pud_trans_huge(pud_t pud)
 }
 #endif
 
-#define has_transparent_hugepage has_transparent_hugepage
-static inline int has_transparent_hugepage(void)
+#define arch_has_pmd_leaves arch_has_pmd_leaves
+static inline int arch_has_pmd_leaves(void)
 {
 	return boot_cpu_has(X86_FEATURE_PSE);
 }
diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h
index e4c5f70b0a01..02a2772ec548 100644
--- a/include/linux/pgtable.h
+++ b/include/linux/pgtable.h
@@ -2026,8 +2026,8 @@ static inline bool pgtable_has_pmd_leaves(void)
 #endif
 #endif
 
-#ifndef has_transparent_hugepage
-#define has_transparent_hugepage() IS_BUILTIN(CONFIG_TRANSPARENT_HUGEPAGE)
+#ifndef arch_has_pmd_leaves
+#define arch_has_pmd_leaves() IS_BUILTIN(CONFIG_TRANSPARENT_HUGEPAGE)
 #endif
 
 #ifndef has_transparent_pud_hugepage
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index 1d1b74950332..9bfa11aa2cbc 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -904,7 +904,7 @@ static int __init hugepage_init(void)
 	int err;
 	struct kobject *hugepage_kobj;
 
-	if (!has_transparent_hugepage()) {
+	if (!arch_has_pmd_leaves()) {
 		transparent_hugepage_flags = 1 << TRANSPARENT_HUGEPAGE_UNSUPPORTED;
 		return -EINVAL;
 	}
diff --git a/mm/memory.c b/mm/memory.c
index 7b50f3ec9b37..6702c9187114 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -181,7 +181,7 @@ EXPORT_SYMBOL(__arch_has_pmd_leaves);
 
 static int __init init_arch_has_pmd_leaves(void)
 {
-	__arch_has_pmd_leaves = has_transparent_hugepage();
+	__arch_has_pmd_leaves = arch_has_pmd_leaves();
 	return 0;
 }
 early_initcall(init_arch_has_pmd_leaves);
diff --git a/mm/shmem.c b/mm/shmem.c
index b9081b817d28..48312b7727a7 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -672,7 +672,7 @@ static int shmem_parse_huge(const char *str)
 	else
 		return -EINVAL;
 
-	if (!has_transparent_hugepage() &&
+	if (!arch_has_pmd_leaves() &&
 	    huge != SHMEM_HUGE_NEVER && huge != SHMEM_HUGE_DENY)
 		return -EINVAL;
 
@@ -4646,7 +4646,7 @@ static int shmem_parse_one(struct fs_context *fc, struct fs_parameter *param)
 		ctx->huge = result.uint_32;
 		if (ctx->huge != SHMEM_HUGE_NEVER &&
 		    !(IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) &&
-		      has_transparent_hugepage()))
+		      arch_has_pmd_leaves()))
 			goto unsupported_parameter;
 		ctx->seen |= SHMEM_SEEN_HUGE;
 		break;
@@ -5430,7 +5430,7 @@ void __init shmem_init(void)
 #endif
 
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
-	if (has_transparent_hugepage() && shmem_huge > SHMEM_HUGE_DENY)
+	if (arch_has_pmd_leaves() && shmem_huge > SHMEM_HUGE_DENY)
 		SHMEM_SB(shm_mnt->mnt_sb)->huge = shmem_huge;
 	else
 		shmem_huge = SHMEM_HUGE_NEVER; /* just in case it was patched */
-- 
2.51.1
Re: [RFC 07/10] treewide: rename has_transparent_hugepage() to arch_has_pmd_leaves()
Posted by David Hildenbrand (Red Hat) 1 month ago
On 06.11.25 22:28, Luiz Capitulino wrote:
> Now that the majority of has_transparent_hugepage() callers have been
> converted to pgtable_has_pmd_leaves(), rename has_transparent_hugepage()
> to arch_has_pmd_leaves() since that's what the helper checks for.
> 
> arch_has_pmd_leaves() is supposed to be called only by
> init_arch_has_pmd_leaves(), except for two exeptions:
> 
> 1. shmem: shmem code runs very early during boot so it can't use
>     pgtable_has_pmd_leaves()

Can't we just initialize pgtable_has_pmd_leaves() earlier then?

> 2. hugepage_init(): just a temporary exception, this function will be
>     converted in a future commit
> 
> Signed-off-by: Luiz Capitulino <luizcap@redhat.com>
> ---


[...]

> diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h
> index e4c5f70b0a01..02a2772ec548 100644
> --- a/include/linux/pgtable.h
> +++ b/include/linux/pgtable.h
> @@ -2026,8 +2026,8 @@ static inline bool pgtable_has_pmd_leaves(void)
>   #endif
>   #endif
>   
> -#ifndef has_transparent_hugepage
> -#define has_transparent_hugepage() IS_BUILTIN(CONFIG_TRANSPARENT_HUGEPAGE)
> +#ifndef arch_has_pmd_leaves
> +#define arch_has_pmd_leaves() IS_BUILTIN(CONFIG_TRANSPARENT_HUGEPAGE)
>   #endif

Ah, so it stays for now only set with CONFIG_TRANSPARENT_HUGEPAGE. I 
guess that's something to sort out later :)


-- 
Cheers

David
Re: [RFC 07/10] treewide: rename has_transparent_hugepage() to arch_has_pmd_leaves()
Posted by Luiz Capitulino 1 month ago
On 2025-11-17 12:45, David Hildenbrand (Red Hat) wrote:
> On 06.11.25 22:28, Luiz Capitulino wrote:
>> Now that the majority of has_transparent_hugepage() callers have been
>> converted to pgtable_has_pmd_leaves(), rename has_transparent_hugepage()
>> to arch_has_pmd_leaves() since that's what the helper checks for.
>>
>> arch_has_pmd_leaves() is supposed to be called only by
>> init_arch_has_pmd_leaves(), except for two exeptions:
>>
>> 1. shmem: shmem code runs very early during boot so it can't use
>>     pgtable_has_pmd_leaves()
> 
> Can't we just initialize pgtable_has_pmd_leaves() earlier then?

I can look into doing that. When I worked on this RFC I wondered if
arch_has_pmd_leaves() (when implemented by the arch) could run so early
given that some (all?) archs check feature bits so they must be
available this early as well. But I'll check this, having
pgtable_has_pmd_leaves() being available as early as possible is
probably the right thing to do.

>> 2. hugepage_init(): just a temporary exception, this function will be
>>     converted in a future commit
>>
>> Signed-off-by: Luiz Capitulino <luizcap@redhat.com>
>> ---
> 
> 
> [...]
> 
>> diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h
>> index e4c5f70b0a01..02a2772ec548 100644
>> --- a/include/linux/pgtable.h
>> +++ b/include/linux/pgtable.h
>> @@ -2026,8 +2026,8 @@ static inline bool pgtable_has_pmd_leaves(void)
>>   #endif
>>   #endif
>> -#ifndef has_transparent_hugepage
>> -#define has_transparent_hugepage() IS_BUILTIN(CONFIG_TRANSPARENT_HUGEPAGE)
>> +#ifndef arch_has_pmd_leaves
>> +#define arch_has_pmd_leaves() IS_BUILTIN(CONFIG_TRANSPARENT_HUGEPAGE)
>>   #endif
> 
> Ah, so it stays for now only set with CONFIG_TRANSPARENT_HUGEPAGE. I guess that's something to sort out later :)

I suggested something we could do in this series. Also, I skipped
commenting on all the cases you spotted as I think they refer to the
same issue (please, do point out if you think I'm wrong).
Re: [RFC 07/10] treewide: rename has_transparent_hugepage() to arch_has_pmd_leaves()
Posted by David Hildenbrand (Red Hat) 2 weeks, 3 days ago
On 11/17/25 20:01, Luiz Capitulino wrote:
> On 2025-11-17 12:45, David Hildenbrand (Red Hat) wrote:
>> On 06.11.25 22:28, Luiz Capitulino wrote:
>>> Now that the majority of has_transparent_hugepage() callers have been
>>> converted to pgtable_has_pmd_leaves(), rename has_transparent_hugepage()
>>> to arch_has_pmd_leaves() since that's what the helper checks for.
>>>
>>> arch_has_pmd_leaves() is supposed to be called only by
>>> init_arch_has_pmd_leaves(), except for two exeptions:
>>>
>>> 1. shmem: shmem code runs very early during boot so it can't use
>>>      pgtable_has_pmd_leaves()
>>
>> Can't we just initialize pgtable_has_pmd_leaves() earlier then?
> 
> I can look into doing that. When I worked on this RFC I wondered if
> arch_has_pmd_leaves() (when implemented by the arch) could run so early
> given that some (all?) archs check feature bits so they must be
> available this early as well. But I'll check this, having
> pgtable_has_pmd_leaves() being available as early as possible is
> probably the right thing to do.
> 
>>> 2. hugepage_init(): just a temporary exception, this function will be
>>>      converted in a future commit
>>>
>>> Signed-off-by: Luiz Capitulino <luizcap@redhat.com>
>>> ---
>>
>>
>> [...]
>>
>>> diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h
>>> index e4c5f70b0a01..02a2772ec548 100644
>>> --- a/include/linux/pgtable.h
>>> +++ b/include/linux/pgtable.h
>>> @@ -2026,8 +2026,8 @@ static inline bool pgtable_has_pmd_leaves(void)
>>>    #endif
>>>    #endif
>>> -#ifndef has_transparent_hugepage
>>> -#define has_transparent_hugepage() IS_BUILTIN(CONFIG_TRANSPARENT_HUGEPAGE)
>>> +#ifndef arch_has_pmd_leaves
>>> +#define arch_has_pmd_leaves() IS_BUILTIN(CONFIG_TRANSPARENT_HUGEPAGE)
>>>    #endif
>>
>> Ah, so it stays for now only set with CONFIG_TRANSPARENT_HUGEPAGE. I guess that's something to sort out later :)
> 
> I suggested something we could do in this series. Also, I skipped
> commenting on all the cases you spotted as I think they refer to the
> same issue (please, do point out if you think I'm wrong).

Right. If we keep PMD-leave support glue to CONFIG_TRANSPARENT_HUGEPAGE 
in this series, could we also simplify patch #2, to have it reside in 
mm/huge_memory.c ?

Then, it's clearer that it is still glued to CONFIG_TRANSPARENT_HUGEPAGE.

-- 
Cheers

David