Blame view

include/linux/ftrace_event.h 8.47 KB
97f202515   Steven Rostedt   tracing/events: m...
1
2
  #ifndef _LINUX_FTRACE_EVENT_H
  #define _LINUX_FTRACE_EVENT_H
97f202515   Steven Rostedt   tracing/events: m...
3
  #include <linux/ring_buffer.h>
16bb8eb1b   Steven Rostedt   tracing: allow fi...
4
  #include <linux/trace_seq.h>
be74b73a5   Steven Rostedt   tracing: add __pr...
5
  #include <linux/percpu.h>
20ab4425a   Frederic Weisbecker   tracing: Allocate...
6
  #include <linux/hardirq.h>
430ad5a60   Xiao Guangrong   perf: Factorize t...
7
  #include <linux/perf_event.h>
97f202515   Steven Rostedt   tracing/events: m...
8
9
10
  
  struct trace_array;
  struct tracer;
6d723736e   Steven Rostedt   tracing/events: a...
11
  struct dentry;
97f202515   Steven Rostedt   tracing/events: m...
12

be74b73a5   Steven Rostedt   tracing: add __pr...
13
14
15
16
  struct trace_print_flags {
  	unsigned long		mask;
  	const char		*name;
  };
2fc1b6f0d   liubo   tracing: Add __pr...
17
18
19
20
  struct trace_print_flags_u64 {
  	unsigned long long	mask;
  	const char		*name;
  };
be74b73a5   Steven Rostedt   tracing: add __pr...
21
22
23
  const char *ftrace_print_flags_seq(struct trace_seq *p, const char *delim,
  				   unsigned long flags,
  				   const struct trace_print_flags *flag_array);
0f4fc29dd   Steven Rostedt   tracing: add __pr...
24
25
  const char *ftrace_print_symbols_seq(struct trace_seq *p, unsigned long val,
  				     const struct trace_print_flags *symbol_array);
2fc1b6f0d   liubo   tracing: Add __pr...
26
27
28
29
30
31
  #if BITS_PER_LONG == 32
  const char *ftrace_print_symbols_seq_u64(struct trace_seq *p,
  					 unsigned long long val,
  					 const struct trace_print_flags_u64
  								 *symbol_array);
  #endif
5a2e39959   Kei Tokunaga   [SCSI] ftrace: ad...
32
33
  const char *ftrace_print_hex_seq(struct trace_seq *p,
  				 const unsigned char *buf, int len);
97f202515   Steven Rostedt   tracing/events: m...
34
35
36
37
38
39
40
  /*
   * 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 {
89ec0dee9   Steven Rostedt   tracing: increase...
41
  	unsigned short		type;
97f202515   Steven Rostedt   tracing/events: m...
42
43
44
  	unsigned char		flags;
  	unsigned char		preempt_count;
  	int			pid;
a3a4a5acd   Arjan van de Ven   Regression: parti...
45
  	int			padding;
97f202515   Steven Rostedt   tracing/events: m...
46
  };
89ec0dee9   Steven Rostedt   tracing: increase...
47
48
  #define FTRACE_MAX_EVENT						\
  	((1 << (sizeof(((struct trace_entry *)0)->type) * 8)) - 1)
97f202515   Steven Rostedt   tracing/events: m...
49
50
51
52
53
54
55
56
57
58
59
  /*
   * Trace iterator - used by printout routines who present trace
   * results to users and which routines might sleep, etc:
   */
  struct trace_iterator {
  	struct trace_array	*tr;
  	struct tracer		*trace;
  	void			*private;
  	int			cpu_file;
  	struct mutex		mutex;
  	struct ring_buffer_iter	*buffer_iter[NR_CPUS];
112f38a7e   Steven Rostedt   tracing: make tra...
60
  	unsigned long		iter_flags;
97f202515   Steven Rostedt   tracing/events: m...
61

bc289ae98   Lai Jiangshan   tracing: Reduce l...
62
63
  	/* trace_seq for __print_flags() and __print_symbolic() etc. */
  	struct trace_seq	tmp_seq;
97f202515   Steven Rostedt   tracing/events: m...
64
65
66
  	/* The below is zeroed out in pipe_read */
  	struct trace_seq	seq;
  	struct trace_entry	*ent;
bc21b4784   Steven Rostedt   tracing: Show the...
67
  	unsigned long		lost_events;
a63ce5b30   Steven Rostedt   tracing: Buffer t...
68
  	int			leftover;
4a9bd3f13   Steven Rostedt   tracing: Have dyn...
69
  	int			ent_size;
97f202515   Steven Rostedt   tracing/events: m...
70
71
  	int			cpu;
  	u64			ts;
97f202515   Steven Rostedt   tracing/events: m...
72
73
74
75
76
  	loff_t			pos;
  	long			idx;
  
  	cpumask_var_t		started;
  };
a9a577638   Steven Rostedt   tracing: Allow ev...
77
  struct trace_event;
97f202515   Steven Rostedt   tracing/events: m...
78
  typedef enum print_line_t (*trace_print_func)(struct trace_iterator *iter,
a9a577638   Steven Rostedt   tracing: Allow ev...
79
80
81
  				      int flags, struct trace_event *event);
  
  struct trace_event_functions {
97f202515   Steven Rostedt   tracing/events: m...
82
83
84
85
86
  	trace_print_func	trace;
  	trace_print_func	raw;
  	trace_print_func	hex;
  	trace_print_func	binary;
  };
a9a577638   Steven Rostedt   tracing: Allow ev...
87
88
89
90
91
92
  struct trace_event {
  	struct hlist_node		node;
  	struct list_head		list;
  	int				type;
  	struct trace_event_functions	*funcs;
  };
97f202515   Steven Rostedt   tracing/events: m...
93
94
95
96
97
98
99
100
101
102
  extern int register_ftrace_event(struct trace_event *event);
  extern int unregister_ftrace_event(struct trace_event *event);
  
  /* Return values for print_line callback */
  enum print_line_t {
  	TRACE_TYPE_PARTIAL_LINE	= 0,	/* Retry after flushing the seq */
  	TRACE_TYPE_HANDLED	= 1,
  	TRACE_TYPE_UNHANDLED	= 2,	/* Relay to other output functions */
  	TRACE_TYPE_NO_CONSUME	= 3	/* Handled but ask to not consume */
  };
f413cdb80   Frederic Weisbecker   perf_counter: Fix...
103
104
105
  void tracing_generic_entry_update(struct trace_entry *entry,
  				  unsigned long flags,
  				  int pc);
97f202515   Steven Rostedt   tracing/events: m...
106
  struct ring_buffer_event *
e77405ad8   Steven Rostedt   tracing: pass aro...
107
108
  trace_current_buffer_lock_reserve(struct ring_buffer **current_buffer,
  				  int type, unsigned long len,
97f202515   Steven Rostedt   tracing/events: m...
109
  				  unsigned long flags, int pc);
e77405ad8   Steven Rostedt   tracing: pass aro...
110
111
  void trace_current_buffer_unlock_commit(struct ring_buffer *buffer,
  					struct ring_buffer_event *event,
97f202515   Steven Rostedt   tracing/events: m...
112
  					unsigned long flags, int pc);
e77405ad8   Steven Rostedt   tracing: pass aro...
113
114
  void trace_nowake_buffer_unlock_commit(struct ring_buffer *buffer,
  				       struct ring_buffer_event *event,
97f202515   Steven Rostedt   tracing/events: m...
115
  					unsigned long flags, int pc);
1fd8df2c3   Masami Hiramatsu   tracing/kprobes: ...
116
117
118
119
  void trace_nowake_buffer_unlock_commit_regs(struct ring_buffer *buffer,
  					    struct ring_buffer_event *event,
  					    unsigned long flags, int pc,
  					    struct pt_regs *regs);
e77405ad8   Steven Rostedt   tracing: pass aro...
120
121
  void trace_current_buffer_discard_commit(struct ring_buffer *buffer,
  					 struct ring_buffer_event *event);
97f202515   Steven Rostedt   tracing/events: m...
122
123
  
  void tracing_record_cmdline(struct task_struct *tsk);
1f9963cbb   Li Zefan   tracing/filters: ...
124
  struct event_filter;
2239291ae   Steven Rostedt   tracing: Remove p...
125
126
127
128
129
130
131
132
  enum trace_reg {
  	TRACE_REG_REGISTER,
  	TRACE_REG_UNREGISTER,
  	TRACE_REG_PERF_REGISTER,
  	TRACE_REG_PERF_UNREGISTER,
  };
  
  struct ftrace_event_call;
8f0820183   Steven Rostedt   tracing: Create c...
133
134
  struct ftrace_event_class {
  	char			*system;
2239291ae   Steven Rostedt   tracing: Remove p...
135
136
137
138
139
140
  	void			*probe;
  #ifdef CONFIG_PERF_EVENTS
  	void			*perf_probe;
  #endif
  	int			(*reg)(struct ftrace_event_call *event,
  				       enum trace_reg type);
2e33af029   Steven Rostedt   tracing: Move fie...
141
142
143
  	int			(*define_fields)(struct ftrace_event_call *);
  	struct list_head	*(*get_fields)(struct ftrace_event_call *);
  	struct list_head	fields;
0405ab80a   Steven Rostedt   tracing: Move raw...
144
  	int			(*raw_init)(struct ftrace_event_call *);
8f0820183   Steven Rostedt   tracing: Create c...
145
  };
a1d0ce821   Steven Rostedt   tracing: Use clas...
146
147
  extern int ftrace_event_reg(struct ftrace_event_call *event,
  			    enum trace_reg type);
553552ce1   Steven Rostedt   tracing: Combine ...
148
149
150
  enum {
  	TRACE_EVENT_FL_ENABLED_BIT,
  	TRACE_EVENT_FL_FILTERED_BIT,
e870e9a12   Li Zefan   tracing: Allow to...
151
  	TRACE_EVENT_FL_RECORDED_CMD_BIT,
61c32659b   Frederic Weisbecker   tracing: New flag...
152
  	TRACE_EVENT_FL_CAP_ANY_BIT,
27b14b56a   Li Zefan   tracing: Restore ...
153
  	TRACE_EVENT_FL_NO_SET_FILTER_BIT,
553552ce1   Steven Rostedt   tracing: Combine ...
154
155
156
  };
  
  enum {
e870e9a12   Li Zefan   tracing: Allow to...
157
158
159
  	TRACE_EVENT_FL_ENABLED		= (1 << TRACE_EVENT_FL_ENABLED_BIT),
  	TRACE_EVENT_FL_FILTERED		= (1 << TRACE_EVENT_FL_FILTERED_BIT),
  	TRACE_EVENT_FL_RECORDED_CMD	= (1 << TRACE_EVENT_FL_RECORDED_CMD_BIT),
61c32659b   Frederic Weisbecker   tracing: New flag...
160
  	TRACE_EVENT_FL_CAP_ANY		= (1 << TRACE_EVENT_FL_CAP_ANY_BIT),
27b14b56a   Li Zefan   tracing: Restore ...
161
  	TRACE_EVENT_FL_NO_SET_FILTER	= (1 << TRACE_EVENT_FL_NO_SET_FILTER_BIT),
553552ce1   Steven Rostedt   tracing: Combine ...
162
  };
97f202515   Steven Rostedt   tracing/events: m...
163
  struct ftrace_event_call {
a59fd6027   Steven Rostedt   tracing/events: c...
164
  	struct list_head	list;
8f0820183   Steven Rostedt   tracing: Create c...
165
  	struct ftrace_event_class *class;
97f202515   Steven Rostedt   tracing/events: m...
166
  	char			*name;
97f202515   Steven Rostedt   tracing/events: m...
167
  	struct dentry		*dir;
80decc70a   Steven Rostedt   tracing: Move pri...
168
  	struct trace_event	event;
509e760cd   Lai Jiangshan   tracing: Add prin...
169
  	const char		*print_fmt;
1f9963cbb   Li Zefan   tracing/filters: ...
170
  	struct event_filter	*filter;
6d723736e   Steven Rostedt   tracing/events: a...
171
  	void			*mod;
69fd4f0eb   Jason Baron   tracing: Add ftra...
172
  	void			*data;
97f202515   Steven Rostedt   tracing/events: m...
173

553552ce1   Steven Rostedt   tracing: Combine ...
174
175
176
177
  	/*
  	 * 32 bit flags:
  	 *   bit 1:		enabled
  	 *   bit 2:		filter_active
e870e9a12   Li Zefan   tracing: Allow to...
178
  	 *   bit 3:		enabled cmd record
553552ce1   Steven Rostedt   tracing: Combine ...
179
  	 *
1eaa4787a   Steven Rostedt   tracing: Comment ...
180
181
182
183
184
185
186
187
  	 * Changes to flags must hold the event_mutex.
  	 *
  	 * Note: Reads of flags do not hold the event_mutex since
  	 * they occur in critical sections. But the way flags
  	 * is currently used, these changes do no affect the code
  	 * except that when a change is made, it may have a slight
  	 * delay in propagating the changes to other CPUs due to
  	 * caching and such.
553552ce1   Steven Rostedt   tracing: Combine ...
188
189
  	 */
  	unsigned int		flags;
ff5f149b6   Steven Rostedt   Merge branch 'per...
190
  #ifdef CONFIG_PERF_EVENTS
6016ee13d   Namhyung Kim   perf, tracing: ad...
191
192
  	int				perf_refcount;
  	struct hlist_head __percpu	*perf_events;
ff5f149b6   Steven Rostedt   Merge branch 'per...
193
  #endif
97f202515   Steven Rostedt   tracing/events: m...
194
  };
53cf810b1   Frederic Weisbecker   tracing: Allow sy...
195
196
197
198
199
200
201
  #define __TRACE_EVENT_FLAGS(name, value)				\
  	static int __init trace_init_flags_##name(void)			\
  	{								\
  		event_##name.flags = value;				\
  		return 0;						\
  	}								\
  	early_initcall(trace_init_flags_##name);
97d5a2200   Frederic Weisbecker   perf: Drop the ob...
202
  #define PERF_MAX_TRACE_SIZE	2048
20ab4425a   Frederic Weisbecker   tracing: Allocate...
203

16bb8eb1b   Steven Rostedt   tracing: allow fi...
204
  #define MAX_FILTER_STR_VAL	256	/* Should handle KSYM_SYMBOL_LEN */
97f202515   Steven Rostedt   tracing/events: m...
205

2df75e415   Li Zefan   tracing/events: f...
206
  extern void destroy_preds(struct ftrace_event_call *call);
6fb2915df   Li Zefan   tracing/profile: ...
207
  extern int filter_match_preds(struct event_filter *filter, void *rec);
e77405ad8   Steven Rostedt   tracing: pass aro...
208
209
  extern int filter_current_check_discard(struct ring_buffer *buffer,
  					struct ftrace_event_call *call,
97f202515   Steven Rostedt   tracing/events: m...
210
211
  					void *rec,
  					struct ring_buffer_event *event);
43b51ead3   Li Zefan   tracing/filters: ...
212
213
214
215
  enum {
  	FILTER_OTHER = 0,
  	FILTER_STATIC_STRING,
  	FILTER_DYN_STRING,
87a342f5d   Li Zefan   tracing/filters: ...
216
  	FILTER_PTR_STRING,
43b51ead3   Li Zefan   tracing/filters: ...
217
  };
042957801   Steven Rostedt   tracing/events: S...
218
219
220
  #define EVENT_STORAGE_SIZE 128
  extern struct mutex event_storage_mutex;
  extern char event_storage[EVENT_STORAGE_SIZE];
87d9b4e1c   Li Zefan   tracing: Extract ...
221
  extern int trace_event_raw_init(struct ftrace_event_call *call);
aeaeae118   Frederic Weisbecker   tracing: Restore ...
222
223
224
  extern int trace_define_field(struct ftrace_event_call *call, const char *type,
  			      const char *name, int offset, int size,
  			      int is_signed, int filter_type);
bd1a5c849   Masami Hiramatsu   tracing: Ftrace d...
225
226
  extern int trace_add_event_call(struct ftrace_event_call *call);
  extern void trace_remove_event_call(struct ftrace_event_call *call);
97f202515   Steven Rostedt   tracing/events: m...
227

a118e4d14   Tom Zanussi   tracing/filters: ...
228
  #define is_signed_type(type)	(((type)(-1)) < 0)
97f202515   Steven Rostedt   tracing/events: m...
229

4671c7940   Steven Rostedt   tracing: add trac...
230
  int trace_set_clr_event(const char *system, const char *event, int set);
97f202515   Steven Rostedt   tracing/events: m...
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
  /*
   * The double __builtin_constant_p is because gcc will give us an error
   * if we try to allocate the static variable to fmt if it is not a
   * constant. Even with the outer if statement optimizing out.
   */
  #define event_trace_printk(ip, fmt, args...)				\
  do {									\
  	__trace_printk_check_format(fmt, ##args);			\
  	tracing_record_cmdline(current);				\
  	if (__builtin_constant_p(fmt)) {				\
  		static const char *trace_printk_fmt			\
  		  __attribute__((section("__trace_printk_fmt"))) =	\
  			__builtin_constant_p(fmt) ? fmt : NULL;		\
  									\
  		__trace_bprintk(ip, trace_printk_fmt, ##args);		\
  	} else								\
  		__trace_printk(ip, fmt, ##args);			\
  } while (0)
07b139c8c   Li Zefan   perf events: Remo...
249
  #ifdef CONFIG_PERF_EVENTS
6fb2915df   Li Zefan   tracing/profile: ...
250
  struct perf_event;
c530665c3   Frederic Weisbecker   perf: Take a hot ...
251
252
  
  DECLARE_PER_CPU(struct pt_regs, perf_trace_regs);
1c024eca5   Peter Zijlstra   perf, trace: Opti...
253
254
  extern int  perf_trace_init(struct perf_event *event);
  extern void perf_trace_destroy(struct perf_event *event);
a4eaf7f14   Peter Zijlstra   perf: Rework the ...
255
256
  extern int  perf_trace_add(struct perf_event *event, int flags);
  extern void perf_trace_del(struct perf_event *event, int flags);
1c024eca5   Peter Zijlstra   perf, trace: Opti...
257
  extern int  ftrace_profile_set_filter(struct perf_event *event, int event_id,
6fb2915df   Li Zefan   tracing/profile: ...
258
259
  				     char *filter_str);
  extern void ftrace_profile_free_filter(struct perf_event *event);
b7e2ecef9   Peter Zijlstra   perf, trace: Opti...
260
261
  extern void *perf_trace_buf_prepare(int size, unsigned short type,
  				    struct pt_regs *regs, int *rctxp);
430ad5a60   Xiao Guangrong   perf: Factorize t...
262
263
  
  static inline void
97d5a2200   Frederic Weisbecker   perf: Drop the ob...
264
  perf_trace_buf_submit(void *raw_data, int size, int rctx, u64 addr,
1c024eca5   Peter Zijlstra   perf, trace: Opti...
265
  		       u64 count, struct pt_regs *regs, void *head)
430ad5a60   Xiao Guangrong   perf: Factorize t...
266
  {
ecc55f84b   Peter Zijlstra   perf, trace: Inli...
267
  	perf_tp_event(addr, count, raw_data, size, regs, head, rctx);
430ad5a60   Xiao Guangrong   perf: Factorize t...
268
  }
6fb2915df   Li Zefan   tracing/profile: ...
269
  #endif
97f202515   Steven Rostedt   tracing/events: m...
270
  #endif /* _LINUX_FTRACE_EVENT_H */