On Fri, Mar 18, 2022 at 11:58:22AM +0800, Tong Tiangen wrote: > 在 2022/3/18 3:00, Catalin Marinas 写道: > > On Thu, Mar 17, 2022 at 02:12:02PM +0000, Tong Tiangen wrote: > > > @@ -628,6 +647,25 @@ static inline unsigned long pmd_page_vaddr(pmd_t pmd) > > > #define pud_leaf(pud) pud_sect(pud) > > > #define pud_valid(pud) pte_valid(pud_pte(pud)) > > > +#ifdef CONFIG_PAGE_TABLE_CHECK > > > +static inline bool pte_user_accessible_page(pte_t pte) > > > +{ > > > + return (pte_val(pte) & PTE_VALID) && (pte_val(pte) & PTE_USER); > > > +} [...] > > Do we care about PROT_NONE mappings here? They have the valid bit > > cleared but pte_present() is true. > > > > PTC will not check this special type(PROT_NONE) of page. PROT_NONE is just a permission but since we don't have independent read and write bits in the pte, we implement it as an invalid pte (bit 0 cleared). The other content of the pte is fine, so pte_pfn() should still work. PTC could as well check this, I don't think it hurts. > > > +static inline bool pmd_user_accessible_page(pmd_t pmd) > > > +{ > > > + return pmd_leaf(pmd) && (pmd_val(pmd) & PTE_VALID) && > > > + (pmd_val(pmd) & PTE_USER); > > > +} > > > > pmd_leaf() implies valid, so you can skip it if that's the aim. > > PTC only checks whether the memory block corresponding to the pmd_leaf type > can access, for !pmd_leaf, PTC checks at the pte level. So i think this is > necessary. My point is that the (pmd_val(pmd) & PTE_VALID) check is superfluous since that's covered by pmd_leaf() already. -- Catalin