|
@@ -371,6 +371,27 @@ int tracepoint_probe_unregister(struct tracepoint *tp, void *probe, void *data)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(tracepoint_probe_unregister);
|
|
EXPORT_SYMBOL_GPL(tracepoint_probe_unregister);
|
|
|
|
|
|
|
|
+static void for_each_tracepoint_range(struct tracepoint * const *begin,
|
|
|
|
+ struct tracepoint * const *end,
|
|
|
|
+ void (*fct)(struct tracepoint *tp, void *priv),
|
|
|
|
+ void *priv)
|
|
|
|
+{
|
|
|
|
+ if (!begin)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ if (IS_ENABLED(CONFIG_HAVE_ARCH_PREL32_RELOCATIONS)) {
|
|
|
|
+ const int *iter;
|
|
|
|
+
|
|
|
|
+ for (iter = (const int *)begin; iter < (const int *)end; iter++)
|
|
|
|
+ fct(offset_to_ptr(iter), priv);
|
|
|
|
+ } else {
|
|
|
|
+ struct tracepoint * const *iter;
|
|
|
|
+
|
|
|
|
+ for (iter = begin; iter < end; iter++)
|
|
|
|
+ fct(*iter, priv);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
#ifdef CONFIG_MODULES
|
|
#ifdef CONFIG_MODULES
|
|
bool trace_module_has_bad_taint(struct module *mod)
|
|
bool trace_module_has_bad_taint(struct module *mod)
|
|
{
|
|
{
|
|
@@ -435,15 +456,9 @@ EXPORT_SYMBOL_GPL(unregister_tracepoint_module_notifier);
|
|
* Ensure the tracer unregistered the module's probes before the module
|
|
* Ensure the tracer unregistered the module's probes before the module
|
|
* teardown is performed. Prevents leaks of probe and data pointers.
|
|
* teardown is performed. Prevents leaks of probe and data pointers.
|
|
*/
|
|
*/
|
|
-static void tp_module_going_check_quiescent(struct tracepoint * const *begin,
|
|
|
|
- struct tracepoint * const *end)
|
|
|
|
|
|
+static void tp_module_going_check_quiescent(struct tracepoint *tp, void *priv)
|
|
{
|
|
{
|
|
- struct tracepoint * const *iter;
|
|
|
|
-
|
|
|
|
- if (!begin)
|
|
|
|
- return;
|
|
|
|
- for (iter = begin; iter < end; iter++)
|
|
|
|
- WARN_ON_ONCE((*iter)->funcs);
|
|
|
|
|
|
+ WARN_ON_ONCE(tp->funcs);
|
|
}
|
|
}
|
|
|
|
|
|
static int tracepoint_module_coming(struct module *mod)
|
|
static int tracepoint_module_coming(struct module *mod)
|
|
@@ -494,8 +509,9 @@ static void tracepoint_module_going(struct module *mod)
|
|
* Called the going notifier before checking for
|
|
* Called the going notifier before checking for
|
|
* quiescence.
|
|
* quiescence.
|
|
*/
|
|
*/
|
|
- tp_module_going_check_quiescent(mod->tracepoints_ptrs,
|
|
|
|
- mod->tracepoints_ptrs + mod->num_tracepoints);
|
|
|
|
|
|
+ for_each_tracepoint_range(mod->tracepoints_ptrs,
|
|
|
|
+ mod->tracepoints_ptrs + mod->num_tracepoints,
|
|
|
|
+ tp_module_going_check_quiescent, NULL);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -547,19 +563,6 @@ static __init int init_tracepoints(void)
|
|
__initcall(init_tracepoints);
|
|
__initcall(init_tracepoints);
|
|
#endif /* CONFIG_MODULES */
|
|
#endif /* CONFIG_MODULES */
|
|
|
|
|
|
-static void for_each_tracepoint_range(struct tracepoint * const *begin,
|
|
|
|
- struct tracepoint * const *end,
|
|
|
|
- void (*fct)(struct tracepoint *tp, void *priv),
|
|
|
|
- void *priv)
|
|
|
|
-{
|
|
|
|
- struct tracepoint * const *iter;
|
|
|
|
-
|
|
|
|
- if (!begin)
|
|
|
|
- return;
|
|
|
|
- for (iter = begin; iter < end; iter++)
|
|
|
|
- fct(*iter, priv);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
/**
|
|
/**
|
|
* for_each_kernel_tracepoint - iteration on all kernel tracepoints
|
|
* for_each_kernel_tracepoint - iteration on all kernel tracepoints
|
|
* @fct: callback
|
|
* @fct: callback
|