diff options
author | Tom Zanussi <tzanussi@gmail.com> | 2009-03-22 04:31:17 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-03-22 13:38:47 -0400 |
commit | cfb180f3e71b2a280a254c8646a9ab1beab63f84 (patch) | |
tree | 93fb1a319b40851ebb7a3cc0d9ea4cc9a88e919a /kernel/trace/trace.h | |
parent | 7ce7e4249921d5073e764f7ff7ad83cfa9894bd7 (diff) |
tracing: add per-subsystem filtering
This patch adds per-subsystem filtering to the event tracing subsystem.
It adds a 'filter' debugfs file to each subsystem directory. This file
can be written to to set filters; reading from it will display the
current set of filters set for that subsystem.
Basically what it does is propagate the filter down to each event
contained in the subsystem. If a particular event doesn't have a field
with the name specified in the filter, it simply doesn't get set for
that event. You can verify whether or not the filter was set for a
particular event by looking at the filter file for that event.
As with per-event filters, compound expressions are supported, echoing
'0' to the subsystem's filter file clears all filters in the subsystem,
etc.
Signed-off-by: Tom Zanussi <tzanussi@gmail.com>
Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
LKML-Reference: <1237710677.7703.49.camel@charm-linux>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/trace/trace.h')
-rw-r--r-- | kernel/trace/trace.h | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index d9eb39e4bb38..f267723c3c52 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h | |||
@@ -804,6 +804,18 @@ struct ftrace_event_call { | |||
804 | #endif | 804 | #endif |
805 | }; | 805 | }; |
806 | 806 | ||
807 | struct event_subsystem { | ||
808 | struct list_head list; | ||
809 | const char *name; | ||
810 | struct dentry *entry; | ||
811 | struct filter_pred **preds; | ||
812 | }; | ||
813 | |||
814 | #define events_for_each(event) \ | ||
815 | for (event = __start_ftrace_events; \ | ||
816 | (unsigned long)event < (unsigned long)__stop_ftrace_events; \ | ||
817 | event++) | ||
818 | |||
807 | #define MAX_FILTER_PRED 8 | 819 | #define MAX_FILTER_PRED 8 |
808 | 820 | ||
809 | struct filter_pred; | 821 | struct filter_pred; |
@@ -832,6 +844,9 @@ extern int filter_add_pred(struct ftrace_event_call *call, | |||
832 | struct filter_pred *pred); | 844 | struct filter_pred *pred); |
833 | extern void filter_free_preds(struct ftrace_event_call *call); | 845 | extern void filter_free_preds(struct ftrace_event_call *call); |
834 | extern int filter_match_preds(struct ftrace_event_call *call, void *rec); | 846 | extern int filter_match_preds(struct ftrace_event_call *call, void *rec); |
847 | extern void filter_free_subsystem_preds(struct event_subsystem *system); | ||
848 | extern int filter_add_subsystem_pred(struct event_subsystem *system, | ||
849 | struct filter_pred *pred); | ||
835 | 850 | ||
836 | void event_trace_printk(unsigned long ip, const char *fmt, ...); | 851 | void event_trace_printk(unsigned long ip, const char *fmt, ...); |
837 | extern struct ftrace_event_call __start_ftrace_events[]; | 852 | extern struct ftrace_event_call __start_ftrace_events[]; |