Re: [PATCH v3 5/9] mm: convert PTE table entry to pte

From: Muhammad Usama Anjum

Date: Fri Oct 02 2026 - 11:18:34 EST


On 01/10/2026 12:17 pm, David Hildenbrand (Arm) wrote:
> On 9/22/26 19:12, Muhammad Usama Anjum wrote:
>> The non-MMU stub receives hw_pte_t but returns a software PTE value. It
>> has no attached PTE that requires ptep_get(), so convert only the stored
>> entry through __pte_from_hw().
>>
>> Signed-off-by: Muhammad Usama Anjum <usama.anjum@xxxxxxx>
>> ---
>> Changes since v1:
>> - Explain why the NOMMU stub does not use ptep_get().
>> - Use software PTE value terminology.
>> ---
>> include/linux/hugetlb.h | 3 ++-
>> 1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
>> index 0d2101facaa50..637fc863d3687 100644
>> --- a/include/linux/hugetlb.h
>> +++ b/include/linux/hugetlb.h
>> @@ -1278,7 +1278,8 @@ static inline pte_t huge_ptep_clear_flush(struct vm_area_struct *vma,
>> #ifdef CONFIG_MMU
>> return ptep_get(ptep);
>> #else
>> - return *ptep;
>> + /* No attached PTE that requires ptep_get(). */
>> + return __pte_from_hw(*ptep);
>> #endif
>> }
>>
>>
>
> Okay, that looks quite odd. No NOMMU code should ever be calling this helper. I
> can understand that some NOMMU code might, for some odd reason, end up including
> hguetlb.h where we have !CONFIG_HUGETLB_PAGE.
>
> But let's see who actually calls huge_ptep_clear_flush():
>
> arch/arm64/mm/hugetlbpage.c: only with CONFIG_HUGETLB_PAGE
> mm/hugetlb.c: only with CONFIG_HUGETLB_PAGE
> mm/rmap.c: only after checking folio_test_hugetlb().
>
> I suspect we can simply do:
>
> diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
> index 80a5a03e9cee..8642c863c1b7 100644
> --- a/include/linux/hugetlb.h
> +++ b/include/linux/hugetlb.h
> @@ -1268,15 +1268,8 @@ static inline void hugetlb_count_sub(long l, struct
> mm_struct *mm)
> pte_t huge_ptep_get(struct mm_struct *mm, unsigned long addr, pte_t *ptep);
> unsigned long huge_pte_dirty(pte_t pte);
>
> -static inline pte_t huge_ptep_clear_flush(struct vm_area_struct *vma,
> - unsigned long addr, pte_t *ptep)
> -{
> -#ifdef CONFIG_MMU
> - return ptep_get(ptep);
> -#else
> - return *ptep;
> -#endif
> -}
> +pte_t huge_ptep_clear_flush(struct vm_area_struct *vma, unsigned long addr,
> + pte_t *ptep);
>
> static inline void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
> pte_t *ptep, pte_t pte, unsigned long sz)

Thank you for digging into the code to sort this out. I'll confirm
and update this patch in the next version.

--
Thanks,
Usama