tracepoint: Use struct pointer instead of name hash for reg/unreg tracepoints
Register/unregister tracepoint probes with struct tracepoint pointer rather than tracepoint name. This change, which vastly simplifies tracepoint.c, has been proposed by Steven Rostedt. It also removes 8.8kB (mostly of text) to the vmlinux size. From this point on, the tracers need to pass a struct tracepoint pointer to probe register/unregister. A probe can now only be connected to a tracepoint that exists. Moreover, tracers are responsible for unregistering the probe before the module containing its associated tracepoint is unloaded. text data bss dec hex filename 10443444 4282528 10391552 25117524 17f4354 vmlinux.orig 10434930 4282848 10391552 25109330 17f2352 vmlinux Link: http://lkml.kernel.org/r/1396992381-23785-2-git-send-email-mathieu.desnoyers@efficios.com CC: Ingo Molnar <mingo@kernel.org> CC: Frederic Weisbecker <fweisbec@gmail.com> CC: Andrew Morton <akpm@linux-foundation.org> CC: Frank Ch. Eigler <fche@redhat.com> CC: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> [ SDR - fixed return val in void func in tracepoint_module_going() ] Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
committed by
Steven Rostedt
parent
68114e5eb8
commit
de7b297390
@@ -6,7 +6,7 @@
|
||||
*
|
||||
* See Documentation/trace/tracepoints.txt.
|
||||
*
|
||||
* (C) Copyright 2008 Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
|
||||
* Copyright (C) 2008-2014 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
|
||||
*
|
||||
* Heavily inspired from the Linux Kernel Markers.
|
||||
*
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
struct module;
|
||||
struct tracepoint;
|
||||
struct notifier_block;
|
||||
|
||||
struct tracepoint_func {
|
||||
void *func;
|
||||
@@ -35,18 +36,13 @@ struct tracepoint {
|
||||
struct tracepoint_func __rcu *funcs;
|
||||
};
|
||||
|
||||
/*
|
||||
* Connect a probe to a tracepoint.
|
||||
* Internal API, should not be used directly.
|
||||
*/
|
||||
extern int tracepoint_probe_register(const char *name, void *probe, void *data);
|
||||
|
||||
/*
|
||||
* Disconnect a probe from a tracepoint.
|
||||
* Internal API, should not be used directly.
|
||||
*/
|
||||
extern int
|
||||
tracepoint_probe_unregister(const char *name, void *probe, void *data);
|
||||
tracepoint_probe_register(struct tracepoint *tp, void *probe, void *data);
|
||||
extern int
|
||||
tracepoint_probe_unregister(struct tracepoint *tp, void *probe, void *data);
|
||||
extern void
|
||||
for_each_kernel_tracepoint(void (*fct)(struct tracepoint *tp, void *priv),
|
||||
void *priv);
|
||||
|
||||
#ifdef CONFIG_MODULES
|
||||
struct tp_module {
|
||||
@@ -54,12 +50,25 @@ struct tp_module {
|
||||
unsigned int num_tracepoints;
|
||||
struct tracepoint * const *tracepoints_ptrs;
|
||||
};
|
||||
|
||||
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);
|
||||
#else
|
||||
static inline bool trace_module_has_bad_taint(struct module *mod)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
static inline
|
||||
int register_tracepoint_module_notifier(struct notifier_block *nb)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline
|
||||
int unregister_tracepoint_module_notifier(struct notifier_block *nb)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_MODULES */
|
||||
|
||||
/*
|
||||
@@ -160,14 +169,14 @@ static inline void tracepoint_synchronize_unregister(void)
|
||||
static inline int \
|
||||
register_trace_##name(void (*probe)(data_proto), void *data) \
|
||||
{ \
|
||||
return tracepoint_probe_register(#name, (void *)probe, \
|
||||
data); \
|
||||
return tracepoint_probe_register(&__tracepoint_##name, \
|
||||
(void *)probe, data); \
|
||||
} \
|
||||
static inline int \
|
||||
unregister_trace_##name(void (*probe)(data_proto), void *data) \
|
||||
{ \
|
||||
return tracepoint_probe_unregister(#name, (void *)probe, \
|
||||
data); \
|
||||
return tracepoint_probe_unregister(&__tracepoint_##name,\
|
||||
(void *)probe, data); \
|
||||
} \
|
||||
static inline void \
|
||||
check_trace_callback_type_##name(void (*cb)(data_proto)) \
|
||||
|
||||
Reference in New Issue
Block a user