On Tue, Jun 20, 2023 at 4:05 PM Jason Gunthorpe <jgg@xxxxxxxxxx> wrote: > > On Tue, Jun 20, 2023 at 01:01:39PM -0700, Vishal Moola wrote: > > On Fri, Jun 16, 2023 at 5:38 AM Jason Gunthorpe <jgg@xxxxxxxxxx> wrote: > > > > > > On Mon, Jun 12, 2023 at 02:03:53PM -0700, Vishal Moola (Oracle) wrote: > > > > Currently, page table information is stored within struct page. As part > > > > of simplifying struct page, create struct ptdesc for page table > > > > information. > > > > > > > > Signed-off-by: Vishal Moola (Oracle) <vishal.moola@xxxxxxxxx> > > > > --- > > > > include/linux/pgtable.h | 51 +++++++++++++++++++++++++++++++++++++++++ > > > > 1 file changed, 51 insertions(+) > > > > > > > > diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h > > > > index c5a51481bbb9..330de96ebfd6 100644 > > > > --- a/include/linux/pgtable.h > > > > +++ b/include/linux/pgtable.h > > > > @@ -975,6 +975,57 @@ static inline void ptep_modify_prot_commit(struct vm_area_struct *vma, > > > > #endif /* __HAVE_ARCH_PTEP_MODIFY_PROT_TRANSACTION */ > > > > #endif /* CONFIG_MMU */ > > > > > > > > + > > > > +/** > > > > + * struct ptdesc - Memory descriptor for page tables. > > > > + * @__page_flags: Same as page flags. Unused for page tables. > > > > + * @pt_list: List of used page tables. Used for s390 and x86. > > > > + * @_pt_pad_1: Padding that aliases with page's compound head. > > > > + * @pmd_huge_pte: Protected by ptdesc->ptl, used for THPs. > > > > + * @_pt_s390_gaddr: Aliases with page's mapping. Used for s390 gmap only. > > > > + * @pt_mm: Used for x86 pgds. > > > > + * @pt_frag_refcount: For fragmented page table tracking. Powerpc and s390 only. > > > > + * @ptl: Lock for the page table. > > > > + * > > > > + * This struct overlays struct page for now. Do not modify without a good > > > > + * understanding of the issues. > > > > + */ > > > > +struct ptdesc { > > > > + unsigned long __page_flags; > > > > + > > > > + union { > > > > + struct list_head pt_list; > > > > + struct { > > > > + unsigned long _pt_pad_1; > > > > + pgtable_t pmd_huge_pte; > > > > + }; > > > > + }; > > > > + unsigned long _pt_s390_gaddr; > > > > + > > > > + union { > > > > + struct mm_struct *pt_mm; > > > > + atomic_t pt_frag_refcount; > > > > + }; > > > > + > > > > +#if ALLOC_SPLIT_PTLOCKS > > > > + spinlock_t *ptl; > > > > +#else > > > > + spinlock_t ptl; > > > > +#endif > > > > +}; > > > > > > I think you should include the memcg here too? It needs to be valid > > > for a ptdesc, even if we don't currently deref it through the ptdesc > > > type. > > > > Yes, thanks for catching that! I'll add it to v5. > > > > > Also, do you see a way to someday put a 'struct rcu_head' into here? > > > > Eventually, when they're being dynamically allocated independent of > > struct page. Although at that point I'm not sure if we'll need one. > > Sooner than dynamic struct page? > > Probably it can overlap pt_list in alot of arches? Ah yes, there will be one if v5 overlapping with pt_list (it already does in struct page anyways).