mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-27 09:02:06 +00:00
tracepoint: Give priority to probes of tracepoints
In order to guarantee that a probe will be called before other probes that are attached to a tracepoint, there needs to be a mechanism to provide priority of one probe over the others. Adding a prio field to the struct tracepoint_func, which lets the probes be sorted by the priority set in the structure. If no priority is specified, then a priority of 10 is given (this is a macro, and perhaps may be changed in the future). Now probes may be added to affect other probes that are attached to a tracepoint with a guaranteed order. One use case would be to allow tracing of tracepoints be able to filter by pid. A special (higher priority probe) may be added to the sched_switch tracepoint and set the necessary flags of the other tracepoints to notify them if they should be traced or not. In case a tracepoint is enabled at the sched_switch tracepoint too, the order of the two are not random. Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
parent
883a1e867e
commit
7904b5c498
2 changed files with 70 additions and 18 deletions
|
@ -26,6 +26,7 @@ struct notifier_block;
|
|||
struct tracepoint_func {
|
||||
void *func;
|
||||
void *data;
|
||||
int prio;
|
||||
};
|
||||
|
||||
struct tracepoint {
|
||||
|
@ -42,9 +43,14 @@ struct trace_enum_map {
|
|||
unsigned long enum_value;
|
||||
};
|
||||
|
||||
#define TRACEPOINT_DEFAULT_PRIO 10
|
||||
|
||||
extern int
|
||||
tracepoint_probe_register(struct tracepoint *tp, void *probe, void *data);
|
||||
extern int
|
||||
tracepoint_probe_register_prio(struct tracepoint *tp, void *probe, void *data,
|
||||
int prio);
|
||||
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),
|
||||
|
@ -207,6 +213,13 @@ extern void syscall_unregfunc(void);
|
|||
(void *)probe, data); \
|
||||
} \
|
||||
static inline int \
|
||||
register_trace_prio_##name(void (*probe)(data_proto), void *data,\
|
||||
int prio) \
|
||||
{ \
|
||||
return tracepoint_probe_register_prio(&__tracepoint_##name, \
|
||||
(void *)probe, data, prio); \
|
||||
} \
|
||||
static inline int \
|
||||
unregister_trace_##name(void (*probe)(data_proto), void *data) \
|
||||
{ \
|
||||
return tracepoint_probe_unregister(&__tracepoint_##name,\
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue