The subject has a typo, "tterating" -> "iterating". I'll fix it and import this to probes/for-next.
Thank you, On Sun, 18 Aug 2024 19:43:07 +0900 "Masami Hiramatsu (Google)" <[email protected]> wrote: > From: Masami Hiramatsu (Google) <[email protected]> > > Add for_each_tracepoint_in_module() function to iterate tracepoints in > a module. This API is needed for handling tracepoints in a loading > module from tracepoint_module_notifier callback function. > This also update for_each_module_tracepoint() to pass the module to > callback function so that it can find module easily. > > Signed-off-by: Masami Hiramatsu (Google) <[email protected]> > --- > Changes in v3: > - Newly added. > --- > include/linux/tracepoint.h | 17 +++++++++++++++-- > kernel/tracepoint.c | 37 +++++++++++++++++++++++++++++-------- > 2 files changed, 44 insertions(+), 10 deletions(-) > > diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h > index 837fcf8ec0d5..93a9f3070b48 100644 > --- a/include/linux/tracepoint.h > +++ b/include/linux/tracepoint.h > @@ -64,8 +64,13 @@ struct tp_module { > bool trace_module_has_bad_taint(struct module *mod); > extern int register_tracepoint_module_notifier(struct notifier_block *nb); > extern int unregister_tracepoint_module_notifier(struct notifier_block *nb); > -void for_each_module_tracepoint(void (*fct)(struct tracepoint *, void *), > +void for_each_module_tracepoint(void (*fct)(struct tracepoint *, > + struct module *, void *), > void *priv); > +void for_each_tracepoint_in_module(struct module *, > + void (*fct)(struct tracepoint *, > + struct module *, void *), > + void *priv); > #else > static inline bool trace_module_has_bad_taint(struct module *mod) > { > @@ -82,10 +87,18 @@ int unregister_tracepoint_module_notifier(struct > notifier_block *nb) > return 0; > } > static inline > -void for_each_module_tracepoint(void (*fct)(struct tracepoint *, void *), > +void for_each_module_tracepoint(void (*fct)(struct tracepoint *, > + struct module *, void *), > void *priv) > { > } > +static inline > +void for_each_tracepoint_in_module(struct module *mod, > + void (*fct)(struct tracepoint *, > + struct module *, void *), > + void *priv) > +{ > +} > #endif /* CONFIG_MODULES */ > > /* > diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c > index bed4aad36d92..8879da16ef4d 100644 > --- a/kernel/tracepoint.c > +++ b/kernel/tracepoint.c > @@ -736,24 +736,45 @@ static __init int init_tracepoints(void) > } > __initcall(init_tracepoints); > > +/** > + * for_each_tracepoint_in_module - iteration on all tracepoints in a module > + * @mod: module > + * @fct: callback > + * @priv: private data > + */ > +void for_each_tracepoint_in_module(struct module *mod, > + void (*fct)(struct tracepoint *tp, > + struct module *mod, void *priv), > + void *priv) > +{ > + tracepoint_ptr_t *begin, *end, *iter; > + > + lockdep_assert_held(&tracepoint_module_list_mutex); > + > + if (!mod) > + return; > + > + begin = mod->tracepoints_ptrs; > + end = mod->tracepoints_ptrs + mod->num_tracepoints; > + > + for (iter = begin; iter < end; iter++) > + fct(tracepoint_ptr_deref(iter), mod, priv); > +} > + > /** > * for_each_module_tracepoint - iteration on all tracepoints in all modules > * @fct: callback > * @priv: private data > */ > -void for_each_module_tracepoint(void (*fct)(struct tracepoint *tp, void > *priv), > +void for_each_module_tracepoint(void (*fct)(struct tracepoint *tp, > + struct module *mod, void *priv), > void *priv) > { > struct tp_module *tp_mod; > - struct module *mod; > > mutex_lock(&tracepoint_module_list_mutex); > - list_for_each_entry(tp_mod, &tracepoint_module_list, list) { > - mod = tp_mod->mod; > - for_each_tracepoint_range(mod->tracepoints_ptrs, > - mod->tracepoints_ptrs + mod->num_tracepoints, > - fct, priv); > - } > + list_for_each_entry(tp_mod, &tracepoint_module_list, list) > + for_each_tracepoint_in_module(tp_mod->mod, fct, priv); > mutex_unlock(&tracepoint_module_list_mutex); > } > #endif /* CONFIG_MODULES */ > -- Masami Hiramatsu (Google) <[email protected]>
