• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _LINUX_FTRACE_EVENT_H
2 #define _LINUX_FTRACE_EVENT_H
3 
4 #include <linux/ring_buffer.h>
5 #include <linux/trace_seq.h>
6 #include <linux/percpu.h>
7 #include <linux/hardirq.h>
8 #include <linux/perf_event.h>
9 
10 struct trace_array;
11 struct trace_buffer;
12 struct tracer;
13 struct dentry;
14 
15 struct trace_print_flags {
16 	unsigned long		mask;
17 	const char		*name;
18 };
19 
20 struct trace_print_flags_u64 {
21 	unsigned long long	mask;
22 	const char		*name;
23 };
24 
25 const char *ftrace_print_flags_seq(struct trace_seq *p, const char *delim,
26 				   unsigned long flags,
27 				   const struct trace_print_flags *flag_array);
28 
29 const char *ftrace_print_symbols_seq(struct trace_seq *p, unsigned long val,
30 				     const struct trace_print_flags *symbol_array);
31 
32 #if BITS_PER_LONG == 32
33 const char *ftrace_print_symbols_seq_u64(struct trace_seq *p,
34 					 unsigned long long val,
35 					 const struct trace_print_flags_u64
36 								 *symbol_array);
37 #endif
38 
39 const char *ftrace_print_hex_seq(struct trace_seq *p,
40 				 const unsigned char *buf, int len);
41 
42 struct trace_iterator;
43 struct trace_event;
44 
45 int ftrace_raw_output_prep(struct trace_iterator *iter,
46 			   struct trace_event *event);
47 
48 /*
49  * The trace entry - the most basic unit of tracing. This is what
50  * is printed in the end as a single line in the trace output, such as:
51  *
52  *     bash-15816 [01]   235.197585: idle_cpu <- irq_enter
53  */
54 struct trace_entry {
55 	unsigned short		type;
56 	unsigned char		flags;
57 	unsigned char		preempt_count;
58 	int			pid;
59 };
60 
61 #define FTRACE_MAX_EVENT						\
62 	((1 << (sizeof(((struct trace_entry *)0)->type) * 8)) - 1)
63 
64 /*
65  * Trace iterator - used by printout routines who present trace
66  * results to users and which routines might sleep, etc:
67  */
68 struct trace_iterator {
69 	struct trace_array	*tr;
70 	struct tracer		*trace;
71 	struct trace_buffer	*trace_buffer;
72 	void			*private;
73 	int			cpu_file;
74 	struct mutex		mutex;
75 	struct ring_buffer_iter	**buffer_iter;
76 	unsigned long		iter_flags;
77 
78 	/* trace_seq for __print_flags() and __print_symbolic() etc. */
79 	struct trace_seq	tmp_seq;
80 
81 	/* The below is zeroed out in pipe_read */
82 	struct trace_seq	seq;
83 	struct trace_entry	*ent;
84 	unsigned long		lost_events;
85 	int			leftover;
86 	int			ent_size;
87 	int			cpu;
88 	u64			ts;
89 
90 	loff_t			pos;
91 	long			idx;
92 
93 	cpumask_var_t		started;
94 
95 	/* it's true when current open file is snapshot */
96 	bool			snapshot;
97 };
98 
99 enum trace_iter_flags {
100 	TRACE_FILE_LAT_FMT	= 1,
101 	TRACE_FILE_ANNOTATE	= 2,
102 	TRACE_FILE_TIME_IN_NS	= 4,
103 };
104 
105 
106 typedef enum print_line_t (*trace_print_func)(struct trace_iterator *iter,
107 				      int flags, struct trace_event *event);
108 
109 struct trace_event_functions {
110 	trace_print_func	trace;
111 	trace_print_func	raw;
112 	trace_print_func	hex;
113 	trace_print_func	binary;
114 };
115 
116 struct trace_event {
117 	struct hlist_node		node;
118 	struct list_head		list;
119 	int				type;
120 	struct trace_event_functions	*funcs;
121 };
122 
123 extern int register_ftrace_event(struct trace_event *event);
124 extern int unregister_ftrace_event(struct trace_event *event);
125 
126 /* Return values for print_line callback */
127 enum print_line_t {
128 	TRACE_TYPE_PARTIAL_LINE	= 0,	/* Retry after flushing the seq */
129 	TRACE_TYPE_HANDLED	= 1,
130 	TRACE_TYPE_UNHANDLED	= 2,	/* Relay to other output functions */
131 	TRACE_TYPE_NO_CONSUME	= 3	/* Handled but ask to not consume */
132 };
133 
134 void tracing_generic_entry_update(struct trace_entry *entry,
135 				  unsigned long flags,
136 				  int pc);
137 struct ftrace_event_file;
138 
139 struct ring_buffer_event *
140 trace_event_buffer_lock_reserve(struct ring_buffer **current_buffer,
141 				struct ftrace_event_file *ftrace_file,
142 				int type, unsigned long len,
143 				unsigned long flags, int pc);
144 struct ring_buffer_event *
145 trace_current_buffer_lock_reserve(struct ring_buffer **current_buffer,
146 				  int type, unsigned long len,
147 				  unsigned long flags, int pc);
148 void trace_current_buffer_unlock_commit(struct ring_buffer *buffer,
149 					struct ring_buffer_event *event,
150 					unsigned long flags, int pc);
151 void trace_buffer_unlock_commit(struct ring_buffer *buffer,
152 				struct ring_buffer_event *event,
153 				unsigned long flags, int pc);
154 void trace_buffer_unlock_commit_regs(struct ring_buffer *buffer,
155 				     struct ring_buffer_event *event,
156 				     unsigned long flags, int pc,
157 				     struct pt_regs *regs);
158 void trace_current_buffer_discard_commit(struct ring_buffer *buffer,
159 					 struct ring_buffer_event *event);
160 
161 void tracing_record_cmdline(struct task_struct *tsk);
162 
163 struct event_filter;
164 
165 enum trace_reg {
166 	TRACE_REG_REGISTER,
167 	TRACE_REG_UNREGISTER,
168 #ifdef CONFIG_PERF_EVENTS
169 	TRACE_REG_PERF_REGISTER,
170 	TRACE_REG_PERF_UNREGISTER,
171 	TRACE_REG_PERF_OPEN,
172 	TRACE_REG_PERF_CLOSE,
173 	TRACE_REG_PERF_ADD,
174 	TRACE_REG_PERF_DEL,
175 #endif
176 };
177 
178 struct ftrace_event_call;
179 
180 struct ftrace_event_class {
181 	char			*system;
182 	void			*probe;
183 #ifdef CONFIG_PERF_EVENTS
184 	void			*perf_probe;
185 #endif
186 	int			(*reg)(struct ftrace_event_call *event,
187 				       enum trace_reg type, void *data);
188 	int			(*define_fields)(struct ftrace_event_call *);
189 	struct list_head	*(*get_fields)(struct ftrace_event_call *);
190 	struct list_head	fields;
191 	int			(*raw_init)(struct ftrace_event_call *);
192 };
193 
194 extern int ftrace_event_reg(struct ftrace_event_call *event,
195 			    enum trace_reg type, void *data);
196 
197 enum {
198 	TRACE_EVENT_FL_FILTERED_BIT,
199 	TRACE_EVENT_FL_CAP_ANY_BIT,
200 	TRACE_EVENT_FL_NO_SET_FILTER_BIT,
201 	TRACE_EVENT_FL_IGNORE_ENABLE_BIT,
202 	TRACE_EVENT_FL_WAS_ENABLED_BIT,
203 };
204 
205 /*
206  * Event flags:
207  *  FILTERED	  - The event has a filter attached
208  *  CAP_ANY	  - Any user can enable for perf
209  *  NO_SET_FILTER - Set when filter has error and is to be ignored
210  *  IGNORE_ENABLE - For ftrace internal events, do not enable with debugfs file
211  *  WAS_ENABLED   - Set and stays set when an event was ever enabled
212  *                    (used for module unloading, if a module event is enabled,
213  *                     it is best to clear the buffers that used it).
214  */
215 enum {
216 	TRACE_EVENT_FL_FILTERED		= (1 << TRACE_EVENT_FL_FILTERED_BIT),
217 	TRACE_EVENT_FL_CAP_ANY		= (1 << TRACE_EVENT_FL_CAP_ANY_BIT),
218 	TRACE_EVENT_FL_NO_SET_FILTER	= (1 << TRACE_EVENT_FL_NO_SET_FILTER_BIT),
219 	TRACE_EVENT_FL_IGNORE_ENABLE	= (1 << TRACE_EVENT_FL_IGNORE_ENABLE_BIT),
220 	TRACE_EVENT_FL_WAS_ENABLED	= (1 << TRACE_EVENT_FL_WAS_ENABLED_BIT),
221 };
222 
223 struct ftrace_event_call {
224 	struct list_head	list;
225 	struct ftrace_event_class *class;
226 	char			*name;
227 	struct trace_event	event;
228 	const char		*print_fmt;
229 	struct event_filter	*filter;
230 	struct list_head	*files;
231 	void			*mod;
232 	void			*data;
233 	/*
234 	 *   bit 0:		filter_active
235 	 *   bit 1:		allow trace by non root (cap any)
236 	 *   bit 2:		failed to apply filter
237 	 *   bit 3:		ftrace internal event (do not enable)
238 	 *   bit 4:		Event was enabled by module
239 	 */
240 	int			flags; /* static flags of different events */
241 
242 #ifdef CONFIG_PERF_EVENTS
243 	int				perf_refcount;
244 	struct hlist_head __percpu	*perf_events;
245 #endif
246 };
247 
248 struct trace_array;
249 struct ftrace_subsystem_dir;
250 
251 enum {
252 	FTRACE_EVENT_FL_ENABLED_BIT,
253 	FTRACE_EVENT_FL_RECORDED_CMD_BIT,
254 	FTRACE_EVENT_FL_SOFT_MODE_BIT,
255 	FTRACE_EVENT_FL_SOFT_DISABLED_BIT,
256 };
257 
258 /*
259  * Ftrace event file flags:
260  *  ENABLED	  - The event is enabled
261  *  RECORDED_CMD  - The comms should be recorded at sched_switch
262  *  SOFT_MODE     - The event is enabled/disabled by SOFT_DISABLED
263  *  SOFT_DISABLED - When set, do not trace the event (even though its
264  *                   tracepoint may be enabled)
265  */
266 enum {
267 	FTRACE_EVENT_FL_ENABLED		= (1 << FTRACE_EVENT_FL_ENABLED_BIT),
268 	FTRACE_EVENT_FL_RECORDED_CMD	= (1 << FTRACE_EVENT_FL_RECORDED_CMD_BIT),
269 	FTRACE_EVENT_FL_SOFT_MODE	= (1 << FTRACE_EVENT_FL_SOFT_MODE_BIT),
270 	FTRACE_EVENT_FL_SOFT_DISABLED	= (1 << FTRACE_EVENT_FL_SOFT_DISABLED_BIT),
271 };
272 
273 struct ftrace_event_file {
274 	struct list_head		list;
275 	struct ftrace_event_call	*event_call;
276 	struct dentry			*dir;
277 	struct trace_array		*tr;
278 	struct ftrace_subsystem_dir	*system;
279 
280 	/*
281 	 * 32 bit flags:
282 	 *   bit 0:		enabled
283 	 *   bit 1:		enabled cmd record
284 	 *   bit 2:		enable/disable with the soft disable bit
285 	 *   bit 3:		soft disabled
286 	 *
287 	 * Note: The bits must be set atomically to prevent races
288 	 * from other writers. Reads of flags do not need to be in
289 	 * sync as they occur in critical sections. But the way flags
290 	 * is currently used, these changes do not affect the code
291 	 * except that when a change is made, it may have a slight
292 	 * delay in propagating the changes to other CPUs due to
293 	 * caching and such. Which is mostly OK ;-)
294 	 */
295 	unsigned long		flags;
296 	atomic_t		sm_ref;	/* soft-mode reference counter */
297 };
298 
299 #define __TRACE_EVENT_FLAGS(name, value)				\
300 	static int __init trace_init_flags_##name(void)			\
301 	{								\
302 		event_##name.flags = value;				\
303 		return 0;						\
304 	}								\
305 	early_initcall(trace_init_flags_##name);
306 
307 #define PERF_MAX_TRACE_SIZE	2048
308 
309 #define MAX_FILTER_STR_VAL	256	/* Should handle KSYM_SYMBOL_LEN */
310 
311 extern void destroy_preds(struct ftrace_event_call *call);
312 extern int filter_match_preds(struct event_filter *filter, void *rec);
313 extern int filter_current_check_discard(struct ring_buffer *buffer,
314 					struct ftrace_event_call *call,
315 					void *rec,
316 					struct ring_buffer_event *event);
317 
318 enum {
319 	FILTER_OTHER = 0,
320 	FILTER_STATIC_STRING,
321 	FILTER_DYN_STRING,
322 	FILTER_PTR_STRING,
323 	FILTER_TRACE_FN,
324 };
325 
326 #define EVENT_STORAGE_SIZE 128
327 extern struct mutex event_storage_mutex;
328 extern char event_storage[EVENT_STORAGE_SIZE];
329 
330 extern int trace_event_raw_init(struct ftrace_event_call *call);
331 extern int trace_define_field(struct ftrace_event_call *call, const char *type,
332 			      const char *name, int offset, int size,
333 			      int is_signed, int filter_type);
334 extern int trace_add_event_call(struct ftrace_event_call *call);
335 extern void trace_remove_event_call(struct ftrace_event_call *call);
336 
337 #define is_signed_type(type)	(((type)(-1)) < (type)1)
338 
339 int trace_set_clr_event(const char *system, const char *event, int set);
340 
341 /*
342  * The double __builtin_constant_p is because gcc will give us an error
343  * if we try to allocate the static variable to fmt if it is not a
344  * constant. Even with the outer if statement optimizing out.
345  */
346 #define event_trace_printk(ip, fmt, args...)				\
347 do {									\
348 	__trace_printk_check_format(fmt, ##args);			\
349 	tracing_record_cmdline(current);				\
350 	if (__builtin_constant_p(fmt)) {				\
351 		static const char *trace_printk_fmt			\
352 		  __attribute__((section("__trace_printk_fmt"))) =	\
353 			__builtin_constant_p(fmt) ? fmt : NULL;		\
354 									\
355 		__trace_bprintk(ip, trace_printk_fmt, ##args);		\
356 	} else								\
357 		__trace_printk(ip, fmt, ##args);			\
358 } while (0)
359 
360 #ifdef CONFIG_PERF_EVENTS
361 struct perf_event;
362 
363 DECLARE_PER_CPU(struct pt_regs, perf_trace_regs);
364 
365 extern int  perf_trace_init(struct perf_event *event);
366 extern void perf_trace_destroy(struct perf_event *event);
367 extern int  perf_trace_add(struct perf_event *event, int flags);
368 extern void perf_trace_del(struct perf_event *event, int flags);
369 extern int  ftrace_profile_set_filter(struct perf_event *event, int event_id,
370 				     char *filter_str);
371 extern void ftrace_profile_free_filter(struct perf_event *event);
372 extern void *perf_trace_buf_prepare(int size, unsigned short type,
373 				    struct pt_regs *regs, int *rctxp);
374 
375 static inline void
perf_trace_buf_submit(void * raw_data,int size,int rctx,u64 addr,u64 count,struct pt_regs * regs,void * head,struct task_struct * task)376 perf_trace_buf_submit(void *raw_data, int size, int rctx, u64 addr,
377 		       u64 count, struct pt_regs *regs, void *head,
378 		       struct task_struct *task)
379 {
380 	perf_tp_event(addr, count, raw_data, size, regs, head, rctx, task);
381 }
382 #endif
383 
384 #endif /* _LINUX_FTRACE_EVENT_H */
385