Messages in this thread |  | | Subject | Re: [RFC PATCH v2 2/3] mm: make pXd_addr_end() functions page-table entry aware | From | Christophe Leroy <> | Date | Tue, 8 Sep 2020 10:16:49 +0200 |
| |
Le 08/09/2020 à 09:46, Alexander Gordeev a écrit : > On Tue, Sep 08, 2020 at 07:14:38AM +0200, Christophe Leroy wrote: >> You forgot arch/powerpc/mm/book3s64/subpage_prot.c it seems. > > Yes, and also two more sources :/ > arch/powerpc/mm/kasan/8xx.c > arch/powerpc/mm/kasan/kasan_init_32.c > > But these two are not quite obvious wrt pgd_addr_end() used > while traversing pmds. Could you please clarify a bit? > > > diff --git a/arch/powerpc/mm/kasan/8xx.c b/arch/powerpc/mm/kasan/8xx.c > index 2784224..89c5053 100644 > --- a/arch/powerpc/mm/kasan/8xx.c > +++ b/arch/powerpc/mm/kasan/8xx.c > @@ -15,8 +15,8 @@ > for (k_cur = k_start; k_cur != k_end; k_cur = k_next, pmd += 2, block += SZ_8M) { > pte_basic_t *new; > > - k_next = pgd_addr_end(k_cur, k_end); > - k_next = pgd_addr_end(k_next, k_end); > + k_next = pmd_addr_end(k_cur, k_end); > + k_next = pmd_addr_end(k_next, k_end);
No, I don't think so. On powerpc32 we have only two levels, so pgd and pmd are more or less the same. But pmd_addr_end() as defined in include/asm-generic/pgtable-nopmd.h is a no-op, so I don't think it will work.
It is likely that this function should iterate on pgd, then you get pmd = pmd_offset(pud_offset(p4d_offset(pgd)));
> if ((void *)pmd_page_vaddr(*pmd) != kasan_early_shadow_pte) > continue; > > diff --git a/arch/powerpc/mm/kasan/kasan_init_32.c b/arch/powerpc/mm/kasan/kasan_init_32.c > index fb29404..3f7d6dc6 100644 > --- a/arch/powerpc/mm/kasan/kasan_init_32.c > +++ b/arch/powerpc/mm/kasan/kasan_init_32.c > @@ -38,7 +38,7 @@ int __init kasan_init_shadow_page_tables(unsigned long k_start, unsigned long k_ > for (k_cur = k_start; k_cur != k_end; k_cur = k_next, pmd++) { > pte_t *new; > > - k_next = pgd_addr_end(k_cur, k_end); > + k_next = pmd_addr_end(k_cur, k_end);
Same here I get, iterate on pgd then get pmd = pmd_offset(pud_offset(p4d_offset(pgd)));
> if ((void *)pmd_page_vaddr(*pmd) != kasan_early_shadow_pte) > continue; > > @@ -196,7 +196,7 @@ void __init kasan_early_init(void) > kasan_populate_pte(kasan_early_shadow_pte, PAGE_KERNEL); > > do { > - next = pgd_addr_end(addr, end); > + next = pmd_addr_end(addr, end); > pmd_populate_kernel(&init_mm, pmd, kasan_early_shadow_pte); > } while (pmd++, addr = next, addr != end); > >
Christophe
|  |