trace.h 9.4 KB
Newer Older
1 2 3 4 5 6 7
#ifndef _LINUX_KERNEL_TRACE_H
#define _LINUX_KERNEL_TRACE_H

#include <linux/fs.h>
#include <asm/atomic.h>
#include <linux/sched.h>
#include <linux/clocksource.h>
8
#include <linux/ring_buffer.h>
P
Pekka Paalanen 已提交
9
#include <linux/mmiotrace.h>
10
#include <linux/ftrace.h>
11

12 13 14 15 16 17
enum trace_type {
	__TRACE_FIRST_TYPE = 0,

	TRACE_FN,
	TRACE_CTX,
	TRACE_WAKE,
18
	TRACE_CONT,
19
	TRACE_STACK,
20
	TRACE_PRINT,
21
	TRACE_SPECIAL,
P
Pekka Paalanen 已提交
22 23
	TRACE_MMIO_RW,
	TRACE_MMIO_MAP,
24
	TRACE_BOOT,
25 26 27 28

	__TRACE_LAST_TYPE
};

29 30 31 32 33 34 35
/*
 * Function trace entry - function address and parent function addres:
 */
struct ftrace_entry {
	unsigned long		ip;
	unsigned long		parent_ip;
};
36
extern struct tracer boot_tracer;
37 38 39 40 41 42 43 44 45 46

/*
 * Context switch trace entry - which task (and prio) we switched from/to:
 */
struct ctx_switch_entry {
	unsigned int		prev_pid;
	unsigned char		prev_prio;
	unsigned char		prev_state;
	unsigned int		next_pid;
	unsigned char		next_prio;
P
Peter Zijlstra 已提交
47
	unsigned char		next_state;
48
	unsigned int		next_cpu;
49 50
};

I
Ingo Molnar 已提交
51 52 53 54 55 56 57 58 59
/*
 * Special (free-form) trace entry:
 */
struct special_entry {
	unsigned long		arg1;
	unsigned long		arg2;
	unsigned long		arg3;
};

I
Ingo Molnar 已提交
60 61 62 63
/*
 * Stack-trace entry:
 */

I
Ingo Molnar 已提交
64
#define FTRACE_STACK_ENTRIES	8
I
Ingo Molnar 已提交
65 66 67 68 69

struct stack_entry {
	unsigned long		caller[FTRACE_STACK_ENTRIES];
};

70 71 72 73 74 75 76 77
/*
 * ftrace_printk entry:
 */
struct print_entry {
	unsigned long		ip;
	char			buf[];
};

78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
/*
 * trace_flag_type is an enumeration that holds different
 * states when a trace occurs. These are:
 *  IRQS_OFF	- interrupts were disabled
 *  NEED_RESCED - reschedule is requested
 *  HARDIRQ	- inside an interrupt handler
 *  SOFTIRQ	- inside a softirq handler
 *  CONT	- multiple entries hold the trace item
 */
enum trace_flag_type {
	TRACE_FLAG_IRQS_OFF		= 0x01,
	TRACE_FLAG_NEED_RESCHED		= 0x02,
	TRACE_FLAG_HARDIRQ		= 0x04,
	TRACE_FLAG_SOFTIRQ		= 0x08,
	TRACE_FLAG_CONT			= 0x10,
};

95
/*
96
 * The trace field - the most basic unit of tracing. This is what
97 98 99 100
 * is printed in the end as a single line in the trace output, such as:
 *
 *     bash-15816 [01]   235.197585: idle_cpu <- irq_enter
 */
101
struct trace_field {
102 103 104 105 106 107 108
	char			cpu;
	char			flags;
	char			preempt_count;
	int			pid;
	union {
		struct ftrace_entry		fn;
		struct ctx_switch_entry		ctx;
I
Ingo Molnar 已提交
109
		struct special_entry		special;
I
Ingo Molnar 已提交
110
		struct stack_entry		stack;
111
		struct print_entry		print;
P
Pekka Paalanen 已提交
112 113
		struct mmiotrace_rw		mmiorw;
		struct mmiotrace_map		mmiomap;
114
		struct boot_trace		initcall;
115 116 117
	};
};

118 119 120 121 122 123 124 125 126 127 128 129
struct trace_field_cont {
	char				buf[sizeof(struct trace_field)];
};

struct trace_entry {
	char 				type;
	union {
		struct trace_field	field;
		struct trace_field_cont	cont;
	};
};

130
#define TRACE_ENTRY_SIZE	sizeof(struct trace_entry)
131 132 133 134
#define TRACE_BUF_SIZE		1024
#define TRACE_PRINT_BUF_SIZE \
	(sizeof(struct trace_field) - offsetof(struct trace_field, print.buf))
#define TRACE_CONT_BUF_SIZE	sizeof(struct trace_field)
135 136 137 138 139 140 141 142

/*
 * The CPU trace array - it consists of thousands of trace entries
 * plus some other descriptor data: (for example which task started
 * the trace, etc.)
 */
struct trace_array_cpu {
	atomic_t		disabled;
I
Ingo Molnar 已提交
143

I
Ingo Molnar 已提交
144 145
	/* these fields get copied into max-trace: */
	unsigned long		trace_idx;
146
	unsigned long		overrun;
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
	unsigned long		saved_latency;
	unsigned long		critical_start;
	unsigned long		critical_end;
	unsigned long		critical_sequence;
	unsigned long		nice;
	unsigned long		policy;
	unsigned long		rt_priority;
	cycle_t			preempt_timestamp;
	pid_t			pid;
	uid_t			uid;
	char			comm[TASK_COMM_LEN];
};

struct trace_iterator;

/*
 * The trace array - an array of per-CPU trace arrays. This is the
 * highest level data structure that individual tracers deal with.
 * They have on/off state as well:
 */
struct trace_array {
168
	struct ring_buffer	*buffer;
169 170 171 172
	unsigned long		entries;
	long			ctrl;
	int			cpu;
	cycle_t			time_start;
173
	struct task_struct	*waiter;
174 175 176 177 178 179 180 181 182 183 184
	struct trace_array_cpu	*data[NR_CPUS];
};

/*
 * A specific tracer, represented by methods that operate on a trace array:
 */
struct tracer {
	const char		*name;
	void			(*init)(struct trace_array *tr);
	void			(*reset)(struct trace_array *tr);
	void			(*open)(struct trace_iterator *iter);
185
	void			(*pipe_open)(struct trace_iterator *iter);
186 187 188
	void			(*close)(struct trace_iterator *iter);
	void			(*start)(struct trace_iterator *iter);
	void			(*stop)(struct trace_iterator *iter);
189 190 191
	ssize_t			(*read)(struct trace_iterator *iter,
					struct file *filp, char __user *ubuf,
					size_t cnt, loff_t *ppos);
192
	void			(*ctrl_update)(struct trace_array *tr);
S
Steven Rostedt 已提交
193 194 195 196
#ifdef CONFIG_FTRACE_STARTUP_TEST
	int			(*selftest)(struct tracer *trace,
					    struct trace_array *tr);
#endif
197
	int			(*print_line)(struct trace_iterator *iter);
198 199 200 201
	struct tracer		*next;
	int			print_max;
};

S
Steven Rostedt 已提交
202 203 204
struct trace_seq {
	unsigned char		buffer[PAGE_SIZE];
	unsigned int		len;
205
	unsigned int		readpos;
S
Steven Rostedt 已提交
206 207
};

208 209 210 211 212 213 214
/*
 * 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;
215
	void			*private;
216
	struct ring_buffer_iter	*buffer_iter[NR_CPUS];
I
Ingo Molnar 已提交
217

218 219
	/* The below is zeroed out in pipe_read */
	struct trace_seq	seq;
220
	struct trace_entry	*ent;
I
Ingo Molnar 已提交
221
	int			cpu;
222
	u64			ts;
I
Ingo Molnar 已提交
223

224 225
	unsigned long		iter_flags;
	loff_t			pos;
226
	long			idx;
227 228
};

229
void trace_wake_up(void);
230
void tracing_reset(struct trace_array *tr, int cpu);
231 232
int tracing_open_generic(struct inode *inode, struct file *filp);
struct dentry *tracing_init_dentry(void);
I
Ingo Molnar 已提交
233 234
void init_tracer_sysprof_debugfs(struct dentry *d_tracer);

235 236 237 238 239
struct trace_entry *tracing_get_trace_entry(struct trace_array *tr,
						struct trace_array_cpu *data);
void tracing_generic_entry_update(struct trace_entry *entry,
						unsigned long flags);

240 241 242 243 244 245 246 247 248 249 250
void ftrace(struct trace_array *tr,
			    struct trace_array_cpu *data,
			    unsigned long ip,
			    unsigned long parent_ip,
			    unsigned long flags);
void tracing_sched_switch_trace(struct trace_array *tr,
				struct trace_array_cpu *data,
				struct task_struct *prev,
				struct task_struct *next,
				unsigned long flags);
void tracing_record_cmdline(struct task_struct *tsk);
251 252 253 254 255 256

void tracing_sched_wakeup_trace(struct trace_array *tr,
				struct trace_array_cpu *data,
				struct task_struct *wakee,
				struct task_struct *cur,
				unsigned long flags);
I
Ingo Molnar 已提交
257 258 259 260 261
void trace_special(struct trace_array *tr,
		   struct trace_array_cpu *data,
		   unsigned long arg1,
		   unsigned long arg2,
		   unsigned long arg3);
262 263 264 265 266
void trace_function(struct trace_array *tr,
		    struct trace_array_cpu *data,
		    unsigned long ip,
		    unsigned long parent_ip,
		    unsigned long flags);
267

268 269
void tracing_start_cmdline_record(void);
void tracing_stop_cmdline_record(void);
270 271 272 273 274 275 276 277 278 279 280 281
int register_tracer(struct tracer *type);
void unregister_tracer(struct tracer *type);

extern unsigned long nsecs_to_usecs(unsigned long nsecs);

extern unsigned long tracing_max_latency;
extern unsigned long tracing_thresh;

void update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu);
void update_max_tr_single(struct trace_array *tr,
			  struct task_struct *tsk, int cpu);

I
Ingo Molnar 已提交
282
extern cycle_t ftrace_now(int cpu);
283

284 285 286 287 288 289 290 291
#ifdef CONFIG_FTRACE
void tracing_start_function_trace(void);
void tracing_stop_function_trace(void);
#else
# define tracing_start_function_trace()		do { } while (0)
# define tracing_stop_function_trace()		do { } while (0)
#endif

292 293 294
#ifdef CONFIG_CONTEXT_SWITCH_TRACER
typedef void
(*tracer_switch_func_t)(void *private,
M
Mathieu Desnoyers 已提交
295
			void *__rq,
296 297 298 299 300 301 302 303 304 305 306 307 308
			struct task_struct *prev,
			struct task_struct *next);

struct tracer_switch_ops {
	tracer_switch_func_t		func;
	void				*private;
	struct tracer_switch_ops	*next;
};

#endif /* CONFIG_CONTEXT_SWITCH_TRACER */

#ifdef CONFIG_DYNAMIC_FTRACE
extern unsigned long ftrace_update_tot_cnt;
309 310
#define DYN_FTRACE_TEST_NAME trace_selftest_dynamic_test_func
extern int DYN_FTRACE_TEST_NAME(void);
311 312
#endif

S
Steven Rostedt 已提交
313 314 315 316 317 318 319 320 321 322 323
#ifdef CONFIG_FTRACE_STARTUP_TEST
extern int trace_selftest_startup_function(struct tracer *trace,
					   struct trace_array *tr);
extern int trace_selftest_startup_irqsoff(struct tracer *trace,
					  struct trace_array *tr);
extern int trace_selftest_startup_preemptoff(struct tracer *trace,
					     struct trace_array *tr);
extern int trace_selftest_startup_preemptirqsoff(struct tracer *trace,
						 struct trace_array *tr);
extern int trace_selftest_startup_wakeup(struct tracer *trace,
					 struct trace_array *tr);
S
Steven Noonan 已提交
324 325
extern int trace_selftest_startup_nop(struct tracer *trace,
					 struct trace_array *tr);
S
Steven Rostedt 已提交
326 327
extern int trace_selftest_startup_sched_switch(struct tracer *trace,
					       struct trace_array *tr);
328 329
extern int trace_selftest_startup_sysprof(struct tracer *trace,
					       struct trace_array *tr);
S
Steven Rostedt 已提交
330 331
#endif /* CONFIG_FTRACE_STARTUP_TEST */

I
Ingo Molnar 已提交
332
extern void *head_page(struct trace_array_cpu *data);
333
extern int trace_seq_printf(struct trace_seq *s, const char *fmt, ...);
334 335
extern void trace_seq_print_cont(struct trace_seq *s,
				 struct trace_iterator *iter);
336 337
extern ssize_t trace_seq_to_user(struct trace_seq *s, char __user *ubuf,
				 size_t cnt);
338
extern long ns2usecs(cycle_t nsec);
P
Pekka Paalanen 已提交
339
extern int trace_vprintk(unsigned long ip, const char *fmt, va_list args);
I
Ingo Molnar 已提交
340

341 342
extern unsigned long trace_flags;

S
Steven Rostedt 已提交
343 344 345 346 347 348 349
/*
 * trace_iterator_flags is an enumeration that defines bit
 * positions into trace_flags that controls the output.
 *
 * NOTE: These bits must match the trace_options array in
 *       trace.c.
 */
350 351 352 353 354 355 356 357 358 359
enum trace_iterator_flags {
	TRACE_ITER_PRINT_PARENT		= 0x01,
	TRACE_ITER_SYM_OFFSET		= 0x02,
	TRACE_ITER_SYM_ADDR		= 0x04,
	TRACE_ITER_VERBOSE		= 0x08,
	TRACE_ITER_RAW			= 0x10,
	TRACE_ITER_HEX			= 0x20,
	TRACE_ITER_BIN			= 0x40,
	TRACE_ITER_BLOCK		= 0x80,
	TRACE_ITER_STACKTRACE		= 0x100,
I
Ingo Molnar 已提交
360
	TRACE_ITER_SCHED_TREE		= 0x200,
361
	TRACE_ITER_PRINTK		= 0x400,
362 363
};

364 365
extern struct tracer nop_trace;

366
#endif /* _LINUX_KERNEL_TRACE_H */