[PATCH] tracing: make tracer_init_tracefs initcall asynchronous
Mark-PK Tsai
mark-pk.tsai at mediatek.com
Wed Mar 16 08:58:16 PDT 2022
> > On Fri, 11 Mar 2022 19:26:56 +0800
> > Mark-PK Tsai <mark-pk.tsai at mediatek.com> wrote:
> >
> > > tracer_init_tracefs() is slow especially when there are
> > > lots of trace events.
> > > Create a kthread to do tracer_init_tracefs() asynchronously
> >
> > When making comments like this, please provide the benchmarks you used,
> > with the numbers before and after.
>
> I've retest it with kernel 5.17-rc7 on my arm64 board, and I found that
> the critical path is trace_eval_sync which spend about 430 ms.
> It's almost half of the time the do_initcalls spends.
> Below is the test result.
>
> before after
> tracer_init_tracefs 29872 us 66 us
> trace_eval_sync 429695 us 459370 us
> do_initcalls 797818 us 799890 us
>
> I locally skip trace_eval_sync and got below result.
>
> before after diff
> do_initcalls 359252 us 341725 us -17527 us
>
> So beside this patch, could we add a kernel parameter or a
> option to skip it when it doesn't used right after kernel boot?
>
Please ignore this.
I do more tests and found that ftrace_eval_maps is in INIT_DATA.
So the eval_wq may crash if it doesn't finish before init mem
is freed.
And ftrace_eval_maps is big when there are lots of trace event
(About 6KB with arch/arm64/defconfig).
So it seems not a good idea to remove all the needed funcs from init.
So please review v2 [1] I've just push which queue the tracer_init_tracefs()
to eval_map_wq.
[1]: https://lore.kernel.org/lkml/20220316151639.9216-1-mark-pk.tsai@mediatek.com/
> >
> > > to speed up the initialization of kernel and move the
> > > related functions and variables out of init section.
> >
> > Thus we sacrifice memory for boot time. I'd like to also see how much
> > memory is freed from init before and after this patch.
> >
>
> Below is the INIT_TEXT and INIT_DATA diff:
>
> before after diff
> INIT_TEXT 7F290 7EDAC -0x4e4 bytes
> INIT_DATA 116FE8 116FE8 0 bytes
>
> And the init section is 64K aligned on arm64 so that when I test
> on my platform, the actual memory freed by initmem_free() have no
> diffrence after apply this patch.
>
> #define SEGMENT_ALIGN SZ_64K
>
> > >
> > > static int trace_panic_handler(struct notifier_block *this,
> > > diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
> > > index 3147614c1812..fe055bef1e8f 100644
> > > --- a/kernel/trace/trace_events.c
> > > +++ b/kernel/trace/trace_events.c
> > > @@ -3687,7 +3687,7 @@ static __init int event_trace_init_fields(void)
> > > return 0;
> > > }
> > >
> > > -__init int event_trace_init(void)
> > > +int event_trace_init(void)
> > > {
> > > struct trace_array *tr;
> > > struct dentry *entry;
> >
> > Hmm, this calls early_event_tracer() which is also in __init. Looks like
> > there's going to be a ripple effect due to this change.
> >
> > If we want to go this route, then first a change must be made to remove the
> > needed functions from init, and then see if we can consolidate it. As there
> > are some init functions that are duplicated for init purposes.
>
> Got it!
>
More information about the linux-arm-kernel
mailing list