On 02/12/24 at 12:44pm, Kirill A. Shutemov wrote: > lookup_address() only returns correct page table level for the entry if > the entry is not none. > > Make the helper to always return correct 'level'. It allows to implement > iterator over kernel page tables using lookup_address(). > > Add one more entry into enum pg_level to indicate size of VA covered by > one PGD entry in 5-level paging mode. > > Signed-off-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> > Reviewed-by: Rick Edgecombe <rick.p.edgecombe@xxxxxxxxx> > --- > arch/x86/include/asm/pgtable_types.h | 1 + > arch/x86/mm/pat/set_memory.c | 8 ++++---- > 2 files changed, 5 insertions(+), 4 deletions(-) > > diff --git a/arch/x86/include/asm/pgtable_types.h b/arch/x86/include/asm/pgtable_types.h > index 0b748ee16b3d..3f648ffdfbe5 100644 > --- a/arch/x86/include/asm/pgtable_types.h > +++ b/arch/x86/include/asm/pgtable_types.h > @@ -548,6 +548,7 @@ enum pg_level { > PG_LEVEL_2M, > PG_LEVEL_1G, > PG_LEVEL_512G, > + PG_LEVEL_256T, > PG_LEVEL_NUM > }; > > diff --git a/arch/x86/mm/pat/set_memory.c b/arch/x86/mm/pat/set_memory.c > index f92da8c9a86d..3612e3167147 100644 > --- a/arch/x86/mm/pat/set_memory.c > +++ b/arch/x86/mm/pat/set_memory.c > @@ -666,32 +666,32 @@ pte_t *lookup_address_in_pgd(pgd_t *pgd, unsigned long address, LGTM, Reviewed-by: Baoquan He <bhe@xxxxxxxxxx> By the way, we may need update the code comment above function lookup_address_in_pgd() and function lookup_address() since they don't reflect the latest behaviour of them. > pud_t *pud; > pmd_t *pmd; > > - *level = PG_LEVEL_NONE; > + *level = PG_LEVEL_256T; > > if (pgd_none(*pgd)) > return NULL; > > + *level = PG_LEVEL_512G; > p4d = p4d_offset(pgd, address); > if (p4d_none(*p4d)) > return NULL; > > - *level = PG_LEVEL_512G; > if (p4d_large(*p4d) || !p4d_present(*p4d)) > return (pte_t *)p4d; > > + *level = PG_LEVEL_1G; > pud = pud_offset(p4d, address); > if (pud_none(*pud)) > return NULL; > > - *level = PG_LEVEL_1G; > if (pud_large(*pud) || !pud_present(*pud)) > return (pte_t *)pud; > > + *level = PG_LEVEL_2M; > pmd = pmd_offset(pud, address); > if (pmd_none(*pmd)) > return NULL; > > - *level = PG_LEVEL_2M; > if (pmd_large(*pmd) || !pmd_present(*pmd)) > return (pte_t *)pmd; > > -- > 2.43.0 > _______________________________________________ kexec mailing list kexec@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/kexec