Message ID | 172397778740.286558.15781131277732977643.stgit@devnote2 (mailing list archive) |
---|---|
State | Accepted |
Commit | d4df54f338e43c790460674a3cc7db35b8395421 |
Headers | show |
Series | tracing/probes: Support tracepoint events on modules | expand |
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)" <mhiramat@kernel.org> wrote: > From: Masami Hiramatsu (Google) <mhiramat@kernel.org> > > 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) <mhiramat@kernel.org> > --- > 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 */ >
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 */