Thread (7 messages) 7 messages, 4 authors, 2025-12-18

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

From: Alex Shi <hidden>
Date: 2025-12-15 14:27:04
Also in: linux-mm, linux-s390, sparclinux


On 2025/12/15 14:06, Christophe Leroy (CS GROUP) wrote:
Le 14/12/2025 à 07:55, alexs@kernel.org a écrit :
quoted
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
quoted
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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help