On Fri, Jul 10, 2026 at 08:42:49AM -0700, Sami Tolvanen wrote:
> Hi Aaron,
> 
> On Tue, Jul 7, 2026 at 7:00 PM Aaron Tomlin <[email protected]> wrote:
> >
> > +static const char *initcall_get_modname(initcall_t fn)
> > +{
> > +       struct initcall_modname *p;
> > +       unsigned long addr = (unsigned 
> > long)dereference_function_descriptor(fn);
> > +
> > +       if (system_state >= SYSTEM_FREEING_INITMEM)
> > +               return NULL;
> > +
> > +       if (!is_kernel_text(addr) &&
> > +           !is_kernel_inittext(addr))
> > +               return NULL;
> > +
> > +       for (p = __start_initcall_modnames; p < __stop_initcall_modnames; 
> > p++) {
> > +               if (dereference_function_descriptor(p->initcall_fn) ==
> > +                   dereference_function_descriptor(fn))
> > +                       return p->modname;
> > +       }
> > +       return NULL;
> > +}
> > +
> >  int __init_or_module do_one_initcall(initcall_t fn)
> >  {
> >         int count = preempt_count();
> >         char msgbuf[64];
> > +       const char *modname;
> >         int ret;
> >
> > +       modname = initcall_get_modname(fn);
> 
> If I'm reading this correctly, this ends up scanning the
> initcall_modnames list for every initcall. Have you measured whether
> this has any boot time impact? Can we at least skip this scan if no
> module denylist is provided?

Hi Sami,

Avoiding unnecessary overhead on the critical boot path is absolutely the
right approach.

I completely agree with your suggestion to bypass the scan when it is not
needed. In the forthcoming iteration, I will introduce a fast-path check.
Since the denylist parameter is strictly opt-in, we can simply evaluate
whether module_denylist (or module_blacklist) has been populated before
calling initcall_get_modname().

This was previously reiterated to Arnd here [1].

[1]: 
https://lore.kernel.org/lkml/ea7kdjwoucecvetzf73ce5dpda3l3etb6i75bks6deekfu6mb6@ooptba3x2oh3/


Kind regards,
-- 
Aaron Tomlin

Reply via email to