[PATCH v9 6/7] powerpc/code-patching: Use temporary mm for Radix MMU

Benjamin Gray bgray at linux.ibm.com
Tue Nov 8 16:16:17 AEDT 2022


On Thu, 2022-11-03 at 14:10 +1100, Benjamin Gray wrote:
> On Wed, 2022-11-02 at 10:11 +0000, Christophe Leroy wrote:
> > Le 25/10/2022 à 06:44, Benjamin Gray a écrit :
> > > +       /*
> > > +        * PTE allocation uses GFP_KERNEL which means we need to
> > > +        * pre-allocate the PTE here because we cannot do the
> > > +        * allocation during patching when IRQs are disabled.
> > > +        */
> > > +       pgdp = pgd_offset(mm, addr);
> > > +
> > > +       p4dp = p4d_alloc(mm, pgdp, addr);
> > > +       if (WARN_ON(!p4dp))
> > > +               goto fail_no_p4d;
> > > +
> > > +       pudp = pud_alloc(mm, p4dp, addr);
> > > +       if (WARN_ON(!pudp))
> > > +               goto fail_no_pud;
> > > +
> > > +       pmdp = pmd_alloc(mm, pudp, addr);
> > > +       if (WARN_ON(!pmdp))
> > > +               goto fail_no_pmd;
> > > +
> > > +       ptep = pte_alloc_map(mm, pmdp, addr);
> > > +       if (WARN_ON(!ptep))
> > > +               goto fail_no_pte;
> > 
> > Insn't there standard generic functions to do that ?
> > 
> > For instance, __get_locked_pte() seems to do more or less the same.
> 
> __get_locked_pte invokes walk_to_pmd, which leaks memory if the
> allocation fails. This may not be a concern necessarily at boot
> (though
> I still don't like it), but startup is run every time a CPU comes
> online, so the leak is theoretically unbounded.
> 
> There's no need to leak it in this context, because we know that each
> page is exclusively used by the corresponding patching mm.

I found tlb_gather_mmu() to initialise a struct mmu_gather, so I've
removed all the open coding (it should free any partial page tables if
get_locked_pte fails). Currently running it through CI before posting,
will probably get the v10 out tomorrow.


More information about the Linuxppc-dev mailing list