#include <linux/trace_seq.h>
#include <linux/ring_buffer.h>
-
+#include <linux/percpu.h>
struct trace_array;
struct tracer;
struct dentry;
+DECLARE_PER_CPU(struct trace_seq, ftrace_event_seq);
+
+struct trace_print_flags {
+ unsigned long mask;
+ const char *name;
+};
+
+const char *ftrace_print_flags_seq(struct trace_seq *p, const char *delim,
+ unsigned long flags,
+ const struct trace_print_flags *flag_array);
+
+const char *ftrace_print_symbols_seq(struct trace_seq *p, unsigned long val,
+ const struct trace_print_flags *symbol_array);
+
/*
* The trace entry - the most basic unit of tracing. This is what
* is printed in the end as a single line in the trace output, such as:
* bash-15816 [01] 235.197585: idle_cpu <- irq_enter
*/
struct trace_entry {
- int type;
+ unsigned short type;
unsigned char flags;
unsigned char preempt_count;
int pid;
int tgid;
};
+#define FTRACE_MAX_EVENT \
+ ((1 << (sizeof(((struct trace_entry *)0)->type) * 8)) - 1)
+
/*
* Trace iterator - used by printout routines who present trace
* results to users and which routines might sleep, etc:
int cpu_file;
struct mutex mutex;
struct ring_buffer_iter *buffer_iter[NR_CPUS];
+ unsigned long iter_flags;
/* The below is zeroed out in pipe_read */
struct trace_seq seq;
int cpu;
u64 ts;
- unsigned long iter_flags;
loff_t pos;
long idx;
int flags);
struct trace_event {
struct hlist_node node;
+ struct list_head list;
int type;
trace_print_func trace;
trace_print_func raw;
int (*show_format)(struct trace_seq *s);
int (*define_fields)(void);
struct list_head fields;
- int n_preds;
- struct filter_pred **preds;
+ int filter_active;
+ void *filter;
void *mod;
#ifdef CONFIG_EVENT_PROFILE
#endif
};
-#define MAX_FILTER_PRED 8
+#define MAX_FILTER_PRED 32
#define MAX_FILTER_STR_VAL 128
extern int init_preds(struct ftrace_event_call *call);
+extern void destroy_preds(struct ftrace_event_call *call);
extern int filter_match_preds(struct ftrace_event_call *call, void *rec);
extern int filter_current_check_discard(struct ftrace_event_call *call,
void *rec,
struct ring_buffer_event *event);
extern int trace_define_field(struct ftrace_event_call *call, char *type,
- char *name, int offset, int size);
+ char *name, int offset, int size, int is_signed);
+
+#define is_signed_type(type) (((type)(-1)) < 0)
+int trace_set_clr_event(const char *system, const char *event, int set);
/*
* The double __builtin_constant_p is because gcc will give us an error
__trace_printk(ip, fmt, ##args); \
} while (0)
-#define __common_field(type, item) \
+#define __common_field(type, item, is_signed) \
ret = trace_define_field(event_call, #type, "common_" #item, \
offsetof(typeof(field.ent), item), \
- sizeof(field.ent.item)); \
+ sizeof(field.ent.item), is_signed); \
if (ret) \
return ret;