Re: [RFC PATCH 1/2] mm/pgtable: use ptdesc for pmd_huge_pte

Alex Shi
2025-12-15T14:27:04Z

On 2025/12/15 14:06, Christophe Leroy (CS GROUP) wrote:
>
> Le 14/12/2025 à 07:55, alexs@kernel.org a écrit :
>> From: Alex Shi <alexs@kernel.org>
>>
>> 'pmd_huge_pte' are pgtable variables, but used 'pgtable->lru'
>> instead of pgtable->pt_list in pgtable_trans_huge_deposit/withdraw
>> functions, That's a bit weird.
>>
>> So let's convert the pgtable_t to precise 'struct ptdesc *' for
>> ptdesc->pmd_huge_pte, and mm->pmd_huge_pte, then convert function
>> pgtable_trans_huge_deposit() to use correct ptdesc.
>>
>> This convertion works for most of arch, but failed on s390/sparc/powerpc
>> since they use 'pte_t *' as pgtable_t. Is there any suggestion for these
>> archs? If we could have a solution, we may remove the pgtable_t for other
>> archs.
>
> The use of struct ptdesc * assumes that a pagetable is contained in one
> (or several) page(s).
>
> On powerpc, there can be several page tables in one page. For instance,
> on powerpc 8xx the hardware require page tables to be 4k at all time,
> allthough page sizes can be either 4k or 16k. So in the 16k case there
> are 4 pages tables in one page.

Hi Christophe,

Thanks a lot for the info.

>
> There is some logic in arch/powerpc/mm/pgtable-frag.c to handle that but
> this is only for last levels (PTs and PMDs). For other levels
> kmem_cache_alloc() is used to provide a PxD of the right size. Maybe the
> solution is to convert all levels to using pgtable-frag, but this
> doesn't look trivial. Probably it should be done at core level not at
> arch level.

Uh, glad to hear some idea for this, would you like to give more
detailed explanation of your ideas?

Thanks a lot

>
> Christophe
>
>>
>> Signed-off-by: Alex Shi <alexs@kernel.org>
>> ---
>>
>> diff --git a/arch/powerpc/include/asm/book3s/64/pgtable.h b/arch/
>> powerpc/include/asm/book3s/64/pgtable.h
>> index aac8ce30cd3b..f10736af296d 100644
>> --- a/arch/powerpc/include/asm/book3s/64/pgtable.h
>> +++ b/arch/powerpc/include/asm/book3s/64/pgtable.h
>> @@ -1320,11 +1320,11 @@ pud_t pudp_huge_get_and_clear_full(struct
>> vm_area_struct *vma,
>>   #define __HAVE_ARCH_PGTABLE_DEPOSIT
>>   static inline void pgtable_trans_huge_deposit(struct mm_struct *mm,
>> -                          pmd_t *pmdp, pgtable_t pgtable)
>> +                          pmd_t *pmdp, struct ptdesc *pgtable)
>>   {
>>       if (radix_enabled())
>> -        return radix__pgtable_trans_huge_deposit(mm, pmdp, pgtable);
>> -    return hash__pgtable_trans_huge_deposit(mm, pmdp, pgtable);
>> +        return radix__pgtable_trans_huge_deposit(mm, pmdp,
>> page_ptdesc(pgtable));
>> +    return hash__pgtable_trans_huge_deposit(mm, pmdp,
>> page_ptdesc(pgtable));
>>   }
>
> I can't understand this change.
>
> pgtable is a pointer to a page table, and you want to replace it to
> something that returns a pointer to a struct page, how can it work ?

Sorry for the bothering. Right, it can't work as I mentioned in commit
log. I just want to bring up this issue, and hope you expert to give
some ideas.

Thanks