tracing: Separate out trace events from global variables
The trace events for ftrace are all defined via global variables. The arrays of events and event systems are linked to a global list. This prevents multiple users of the event system (what to enable and what not to). By adding descriptors to represent the event/file relation, as well as to which trace_array descriptor they are associated with, allows for more than one set of events to be defined. Once the trace events files have a link between the trace event and the trace_array they are associated with, we can create multiple trace_arrays that can record separate events in separate buffers. Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
committed by
Steven Rostedt
parent
613f04a0f5
commit
ae63b31e4d
@@ -189,6 +189,8 @@ unsigned long long ns2usecs(cycle_t nsec)
|
||||
*/
|
||||
static struct trace_array global_trace;
|
||||
|
||||
LIST_HEAD(ftrace_trace_arrays);
|
||||
|
||||
static DEFINE_PER_CPU(struct trace_array_cpu, global_trace_cpu);
|
||||
|
||||
int filter_current_check_discard(struct ring_buffer *buffer,
|
||||
@@ -5359,6 +5361,12 @@ __init static int tracer_alloc_buffers(void)
|
||||
|
||||
register_die_notifier(&trace_die_notifier);
|
||||
|
||||
global_trace.flags = TRACE_ARRAY_FL_GLOBAL;
|
||||
|
||||
INIT_LIST_HEAD(&global_trace.systems);
|
||||
INIT_LIST_HEAD(&global_trace.events);
|
||||
list_add(&global_trace.list, &ftrace_trace_arrays);
|
||||
|
||||
while (trace_boot_options) {
|
||||
char *option;
|
||||
|
||||
|
||||
+36
-3
@@ -158,13 +158,39 @@ struct trace_array_cpu {
|
||||
*/
|
||||
struct trace_array {
|
||||
struct ring_buffer *buffer;
|
||||
struct list_head list;
|
||||
int cpu;
|
||||
int buffer_disabled;
|
||||
unsigned int flags;
|
||||
cycle_t time_start;
|
||||
struct dentry *dir;
|
||||
struct dentry *event_dir;
|
||||
struct list_head systems;
|
||||
struct list_head events;
|
||||
struct task_struct *waiter;
|
||||
struct trace_array_cpu *data[NR_CPUS];
|
||||
};
|
||||
|
||||
enum {
|
||||
TRACE_ARRAY_FL_GLOBAL = (1 << 0)
|
||||
};
|
||||
|
||||
extern struct list_head ftrace_trace_arrays;
|
||||
|
||||
/*
|
||||
* The global tracer (top) should be the first trace array added,
|
||||
* but we check the flag anyway.
|
||||
*/
|
||||
static inline struct trace_array *top_trace_array(void)
|
||||
{
|
||||
struct trace_array *tr;
|
||||
|
||||
tr = list_entry(ftrace_trace_arrays.prev,
|
||||
typeof(*tr), list);
|
||||
WARN_ON(!(tr->flags & TRACE_ARRAY_FL_GLOBAL));
|
||||
return tr;
|
||||
}
|
||||
|
||||
#define FTRACE_CMP_TYPE(var, type) \
|
||||
__builtin_types_compatible_p(typeof(var), type *)
|
||||
|
||||
@@ -851,12 +877,19 @@ struct event_filter {
|
||||
struct event_subsystem {
|
||||
struct list_head list;
|
||||
const char *name;
|
||||
struct dentry *entry;
|
||||
struct event_filter *filter;
|
||||
int nr_events;
|
||||
int ref_count;
|
||||
};
|
||||
|
||||
struct ftrace_subsystem_dir {
|
||||
struct list_head list;
|
||||
struct event_subsystem *subsystem;
|
||||
struct trace_array *tr;
|
||||
struct dentry *entry;
|
||||
int ref_count;
|
||||
int nr_events;
|
||||
};
|
||||
|
||||
#define FILTER_PRED_INVALID ((unsigned short)-1)
|
||||
#define FILTER_PRED_IS_RIGHT (1 << 15)
|
||||
#define FILTER_PRED_FOLD (1 << 15)
|
||||
@@ -914,7 +947,7 @@ extern void print_event_filter(struct ftrace_event_call *call,
|
||||
struct trace_seq *s);
|
||||
extern int apply_event_filter(struct ftrace_event_call *call,
|
||||
char *filter_string);
|
||||
extern int apply_subsystem_event_filter(struct event_subsystem *system,
|
||||
extern int apply_subsystem_event_filter(struct ftrace_subsystem_dir *dir,
|
||||
char *filter_string);
|
||||
extern void print_subsystem_event_filter(struct event_subsystem *system,
|
||||
struct trace_seq *s);
|
||||
|
||||
+533
-243
File diff suppressed because it is too large
Load Diff
@@ -1907,16 +1907,17 @@ out_unlock:
|
||||
return err;
|
||||
}
|
||||
|
||||
int apply_subsystem_event_filter(struct event_subsystem *system,
|
||||
int apply_subsystem_event_filter(struct ftrace_subsystem_dir *dir,
|
||||
char *filter_string)
|
||||
{
|
||||
struct event_subsystem *system = dir->subsystem;
|
||||
struct event_filter *filter;
|
||||
int err = 0;
|
||||
|
||||
mutex_lock(&event_mutex);
|
||||
|
||||
/* Make sure the system still has events */
|
||||
if (!system->nr_events) {
|
||||
if (!dir->nr_events) {
|
||||
err = -ENODEV;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user