Blame view

kernel/trace/trace_output.c 27.1 KB
f0868d1e2   Steven Rostedt   ftrace: set up tr...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  /*
   * trace_output.c
   *
   * Copyright (C) 2008 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
   *
   */
  
  #include <linux/module.h>
  #include <linux/mutex.h>
  #include <linux/ftrace.h>
  
  #include "trace_output.h"
  
  /* must be a power of 2 */
  #define EVENT_HASHSIZE	128
52f6ad6dc   zhangwei(Jovi)   tracing: Rename t...
16
  DECLARE_RWSEM(trace_event_sem);
be74b73a5   Steven Rostedt   tracing: add __pr...
17

f0868d1e2   Steven Rostedt   ftrace: set up tr...
18
19
20
  static struct hlist_head event_hash[EVENT_HASHSIZE] __read_mostly;
  
  static int next_event_type = __TRACE_LAST_TYPE + 1;
09ae72348   Steven Rostedt (Red Hat)   tracing: Add trac...
21
22
23
24
25
  enum print_line_t trace_print_bputs_msg_only(struct trace_iterator *iter)
  {
  	struct trace_seq *s = &iter->seq;
  	struct trace_entry *entry = iter->ent;
  	struct bputs_entry *field;
09ae72348   Steven Rostedt (Red Hat)   tracing: Add trac...
26
27
  
  	trace_assign_type(field, entry);
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
28
  	trace_seq_puts(s, field->str);
09ae72348   Steven Rostedt (Red Hat)   tracing: Add trac...
29

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
30
  	return trace_handle_return(s);
09ae72348   Steven Rostedt (Red Hat)   tracing: Add trac...
31
  }
5ef841f6f   Steven Rostedt   tracing: make pri...
32
33
34
35
36
  enum print_line_t trace_print_bprintk_msg_only(struct trace_iterator *iter)
  {
  	struct trace_seq *s = &iter->seq;
  	struct trace_entry *entry = iter->ent;
  	struct bprint_entry *field;
5ef841f6f   Steven Rostedt   tracing: make pri...
37
38
  
  	trace_assign_type(field, entry);
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
39
  	trace_seq_bprintf(s, field->fmt, field->buf);
5ef841f6f   Steven Rostedt   tracing: make pri...
40

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
41
  	return trace_handle_return(s);
5ef841f6f   Steven Rostedt   tracing: make pri...
42
43
44
45
46
47
48
  }
  
  enum print_line_t trace_print_printk_msg_only(struct trace_iterator *iter)
  {
  	struct trace_seq *s = &iter->seq;
  	struct trace_entry *entry = iter->ent;
  	struct print_entry *field;
5ef841f6f   Steven Rostedt   tracing: make pri...
49
50
  
  	trace_assign_type(field, entry);
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
51
  	trace_seq_puts(s, field->buf);
5ef841f6f   Steven Rostedt   tracing: make pri...
52

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
53
  	return trace_handle_return(s);
5ef841f6f   Steven Rostedt   tracing: make pri...
54
  }
be74b73a5   Steven Rostedt   tracing: add __pr...
55
  const char *
645df987f   Steven Rostedt (Red Hat)   tracing: Rename f...
56
57
58
  trace_print_flags_seq(struct trace_seq *p, const char *delim,
  		      unsigned long flags,
  		      const struct trace_print_flags *flag_array)
be74b73a5   Steven Rostedt   tracing: add __pr...
59
60
61
  {
  	unsigned long mask;
  	const char *str;
7b039cb4c   Steven Rostedt (Red Hat)   tracing: Add trac...
62
  	const char *ret = trace_seq_buffer_ptr(p);
e404b321d   Andrey Vagin   tracing: Don't pr...
63
  	int i, first = 1;
be74b73a5   Steven Rostedt   tracing: add __pr...
64

be74b73a5   Steven Rostedt   tracing: add __pr...
65
66
67
68
69
70
71
72
  	for (i = 0;  flag_array[i].name && flags; i++) {
  
  		mask = flag_array[i].mask;
  		if ((flags & mask) != mask)
  			continue;
  
  		str = flag_array[i].name;
  		flags &= ~mask;
e404b321d   Andrey Vagin   tracing: Don't pr...
73
  		if (!first && delim)
be74b73a5   Steven Rostedt   tracing: add __pr...
74
  			trace_seq_puts(p, delim);
e404b321d   Andrey Vagin   tracing: Don't pr...
75
76
  		else
  			first = 0;
be74b73a5   Steven Rostedt   tracing: add __pr...
77
78
79
80
81
  		trace_seq_puts(p, str);
  	}
  
  	/* check for left over flags */
  	if (flags) {
5b3492611   Steven Rostedt   tracing: Don't us...
82
  		if (!first && delim)
be74b73a5   Steven Rostedt   tracing: add __pr...
83
84
85
86
87
  			trace_seq_puts(p, delim);
  		trace_seq_printf(p, "0x%lx", flags);
  	}
  
  	trace_seq_putc(p, 0);
56d8bd3f0   Steven Whitehouse   tracing: fix mult...
88
  	return ret;
be74b73a5   Steven Rostedt   tracing: add __pr...
89
  }
645df987f   Steven Rostedt (Red Hat)   tracing: Rename f...
90
  EXPORT_SYMBOL(trace_print_flags_seq);
be74b73a5   Steven Rostedt   tracing: add __pr...
91

0f4fc29dd   Steven Rostedt   tracing: add __pr...
92
  const char *
645df987f   Steven Rostedt (Red Hat)   tracing: Rename f...
93
94
  trace_print_symbols_seq(struct trace_seq *p, unsigned long val,
  			const struct trace_print_flags *symbol_array)
0f4fc29dd   Steven Rostedt   tracing: add __pr...
95
96
  {
  	int i;
7b039cb4c   Steven Rostedt (Red Hat)   tracing: Add trac...
97
  	const char *ret = trace_seq_buffer_ptr(p);
0f4fc29dd   Steven Rostedt   tracing: add __pr...
98
99
100
101
102
103
104
105
106
  
  	for (i = 0;  symbol_array[i].name; i++) {
  
  		if (val != symbol_array[i].mask)
  			continue;
  
  		trace_seq_puts(p, symbol_array[i].name);
  		break;
  	}
7b039cb4c   Steven Rostedt (Red Hat)   tracing: Add trac...
107
  	if (ret == (const char *)(trace_seq_buffer_ptr(p)))
0f4fc29dd   Steven Rostedt   tracing: add __pr...
108
  		trace_seq_printf(p, "0x%lx", val);
8e1e1df29   Byungchul Park   tracing: Add addi...
109

0f4fc29dd   Steven Rostedt   tracing: add __pr...
110
  	trace_seq_putc(p, 0);
56d8bd3f0   Steven Whitehouse   tracing: fix mult...
111
  	return ret;
0f4fc29dd   Steven Rostedt   tracing: add __pr...
112
  }
645df987f   Steven Rostedt (Red Hat)   tracing: Rename f...
113
  EXPORT_SYMBOL(trace_print_symbols_seq);
0f4fc29dd   Steven Rostedt   tracing: add __pr...
114

2fc1b6f0d   liubo   tracing: Add __pr...
115
116
  #if BITS_PER_LONG == 32
  const char *
645df987f   Steven Rostedt (Red Hat)   tracing: Rename f...
117
  trace_print_symbols_seq_u64(struct trace_seq *p, unsigned long long val,
2fc1b6f0d   liubo   tracing: Add __pr...
118
119
120
  			 const struct trace_print_flags_u64 *symbol_array)
  {
  	int i;
7b039cb4c   Steven Rostedt (Red Hat)   tracing: Add trac...
121
  	const char *ret = trace_seq_buffer_ptr(p);
2fc1b6f0d   liubo   tracing: Add __pr...
122
123
124
125
126
127
128
129
130
  
  	for (i = 0;  symbol_array[i].name; i++) {
  
  		if (val != symbol_array[i].mask)
  			continue;
  
  		trace_seq_puts(p, symbol_array[i].name);
  		break;
  	}
7b039cb4c   Steven Rostedt (Red Hat)   tracing: Add trac...
131
  	if (ret == (const char *)(trace_seq_buffer_ptr(p)))
2fc1b6f0d   liubo   tracing: Add __pr...
132
133
134
135
136
137
  		trace_seq_printf(p, "0x%llx", val);
  
  	trace_seq_putc(p, 0);
  
  	return ret;
  }
645df987f   Steven Rostedt (Red Hat)   tracing: Rename f...
138
  EXPORT_SYMBOL(trace_print_symbols_seq_u64);
2fc1b6f0d   liubo   tracing: Add __pr...
139
  #endif
5a2e39959   Kei Tokunaga   [SCSI] ftrace: ad...
140
  const char *
645df987f   Steven Rostedt (Red Hat)   tracing: Rename f...
141
142
  trace_print_bitmask_seq(struct trace_seq *p, void *bitmask_ptr,
  			unsigned int bitmask_size)
4449bf927   Steven Rostedt (Red Hat)   tracing: Add __bi...
143
  {
7b039cb4c   Steven Rostedt (Red Hat)   tracing: Add trac...
144
  	const char *ret = trace_seq_buffer_ptr(p);
4449bf927   Steven Rostedt (Red Hat)   tracing: Add __bi...
145
146
147
148
149
150
  
  	trace_seq_bitmask(p, bitmask_ptr, bitmask_size * 8);
  	trace_seq_putc(p, 0);
  
  	return ret;
  }
645df987f   Steven Rostedt (Red Hat)   tracing: Rename f...
151
  EXPORT_SYMBOL_GPL(trace_print_bitmask_seq);
4449bf927   Steven Rostedt (Red Hat)   tracing: Add __bi...
152
153
  
  const char *
645df987f   Steven Rostedt (Red Hat)   tracing: Rename f...
154
  trace_print_hex_seq(struct trace_seq *p, const unsigned char *buf, int buf_len)
5a2e39959   Kei Tokunaga   [SCSI] ftrace: ad...
155
156
  {
  	int i;
7b039cb4c   Steven Rostedt (Red Hat)   tracing: Add trac...
157
  	const char *ret = trace_seq_buffer_ptr(p);
5a2e39959   Kei Tokunaga   [SCSI] ftrace: ad...
158
159
160
161
162
163
164
165
  
  	for (i = 0; i < buf_len; i++)
  		trace_seq_printf(p, "%s%2.2x", i == 0 ? "" : " ", buf[i]);
  
  	trace_seq_putc(p, 0);
  
  	return ret;
  }
645df987f   Steven Rostedt (Red Hat)   tracing: Rename f...
166
  EXPORT_SYMBOL(trace_print_hex_seq);
5a2e39959   Kei Tokunaga   [SCSI] ftrace: ad...
167

6ea22486b   Dave Martin   tracing: Add arra...
168
  const char *
645df987f   Steven Rostedt (Red Hat)   tracing: Rename f...
169
170
  trace_print_array_seq(struct trace_seq *p, const void *buf, int count,
  		      size_t el_size)
6ea22486b   Dave Martin   tracing: Add arra...
171
172
173
174
  {
  	const char *ret = trace_seq_buffer_ptr(p);
  	const char *prefix = "";
  	void *ptr = (void *)buf;
ac01ce141   Alex Bennée   tracing: Make ftr...
175
  	size_t buf_len = count * el_size;
6ea22486b   Dave Martin   tracing: Add arra...
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
  
  	trace_seq_putc(p, '{');
  
  	while (ptr < buf + buf_len) {
  		switch (el_size) {
  		case 1:
  			trace_seq_printf(p, "%s0x%x", prefix,
  					 *(u8 *)ptr);
  			break;
  		case 2:
  			trace_seq_printf(p, "%s0x%x", prefix,
  					 *(u16 *)ptr);
  			break;
  		case 4:
  			trace_seq_printf(p, "%s0x%x", prefix,
  					 *(u32 *)ptr);
  			break;
  		case 8:
  			trace_seq_printf(p, "%s0x%llx", prefix,
  					 *(u64 *)ptr);
  			break;
  		default:
  			trace_seq_printf(p, "BAD SIZE:%zu 0x%x", el_size,
  					 *(u8 *)ptr);
  			el_size = 1;
  		}
  		prefix = ",";
  		ptr += el_size;
  	}
  
  	trace_seq_putc(p, '}');
  	trace_seq_putc(p, 0);
  
  	return ret;
  }
645df987f   Steven Rostedt (Red Hat)   tracing: Rename f...
211
  EXPORT_SYMBOL(trace_print_array_seq);
6ea22486b   Dave Martin   tracing: Add arra...
212

892c505aa   Steven Rostedt (Red Hat)   tracing: Rename f...
213
214
  int trace_raw_output_prep(struct trace_iterator *iter,
  			  struct trace_event *trace_event)
f71130de5   Li Zefan   tracing: Add a he...
215
  {
2425bcb92   Steven Rostedt (Red Hat)   tracing: Rename f...
216
  	struct trace_event_call *event;
f71130de5   Li Zefan   tracing: Add a he...
217
218
219
  	struct trace_seq *s = &iter->seq;
  	struct trace_seq *p = &iter->tmp_seq;
  	struct trace_entry *entry;
f71130de5   Li Zefan   tracing: Add a he...
220

2425bcb92   Steven Rostedt (Red Hat)   tracing: Rename f...
221
  	event = container_of(trace_event, struct trace_event_call, event);
f71130de5   Li Zefan   tracing: Add a he...
222
223
224
225
226
227
228
229
  	entry = iter->ent;
  
  	if (entry->type != event->event.type) {
  		WARN_ON_ONCE(1);
  		return TRACE_TYPE_UNHANDLED;
  	}
  
  	trace_seq_init(p);
687fcc4ae   Steven Rostedt (Red Hat)   tracing: Rename f...
230
  	trace_seq_printf(s, "%s: ", trace_event_name(event));
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
231

8e2e095cb   Steven Rostedt (Red Hat)   tracing: Fix retu...
232
  	return trace_handle_return(s);
f71130de5   Li Zefan   tracing: Add a he...
233
  }
892c505aa   Steven Rostedt (Red Hat)   tracing: Rename f...
234
  EXPORT_SYMBOL(trace_raw_output_prep);
f71130de5   Li Zefan   tracing: Add a he...
235

892c505aa   Steven Rostedt (Red Hat)   tracing: Rename f...
236
237
  static int trace_output_raw(struct trace_iterator *iter, char *name,
  			    char *fmt, va_list ap)
1d6bae966   Steven Rostedt   tracing: Move raw...
238
239
  {
  	struct trace_seq *s = &iter->seq;
1d6bae966   Steven Rostedt   tracing: Move raw...
240

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
241
242
  	trace_seq_printf(s, "%s: ", name);
  	trace_seq_vprintf(s, fmt, ap);
1d6bae966   Steven Rostedt   tracing: Move raw...
243

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
244
  	return trace_handle_return(s);
1d6bae966   Steven Rostedt   tracing: Move raw...
245
  }
892c505aa   Steven Rostedt (Red Hat)   tracing: Rename f...
246
  int trace_output_call(struct trace_iterator *iter, char *name, char *fmt, ...)
1d6bae966   Steven Rostedt   tracing: Move raw...
247
248
249
250
251
  {
  	va_list ap;
  	int ret;
  
  	va_start(ap, fmt);
892c505aa   Steven Rostedt (Red Hat)   tracing: Rename f...
252
  	ret = trace_output_raw(iter, name, fmt, ap);
1d6bae966   Steven Rostedt   tracing: Move raw...
253
254
255
256
  	va_end(ap);
  
  	return ret;
  }
892c505aa   Steven Rostedt (Red Hat)   tracing: Rename f...
257
  EXPORT_SYMBOL_GPL(trace_output_call);
1d6bae966   Steven Rostedt   tracing: Move raw...
258

f0868d1e2   Steven Rostedt   ftrace: set up tr...
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
  #ifdef CONFIG_KRETPROBES
  static inline const char *kretprobed(const char *name)
  {
  	static const char tramp_name[] = "kretprobe_trampoline";
  	int size = sizeof(tramp_name);
  
  	if (strncmp(tramp_name, name, size) == 0)
  		return "[unknown/kretprobe'd]";
  	return name;
  }
  #else
  static inline const char *kretprobed(const char *name)
  {
  	return name;
  }
  #endif /* CONFIG_KRETPROBES */
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
275
  static void
f0868d1e2   Steven Rostedt   ftrace: set up tr...
276
277
278
279
280
281
282
283
284
  seq_print_sym_short(struct trace_seq *s, const char *fmt, unsigned long address)
  {
  #ifdef CONFIG_KALLSYMS
  	char str[KSYM_SYMBOL_LEN];
  	const char *name;
  
  	kallsyms_lookup(address, NULL, NULL, NULL, str);
  
  	name = kretprobed(str);
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
285
  	trace_seq_printf(s, fmt, name);
f0868d1e2   Steven Rostedt   ftrace: set up tr...
286
  #endif
f0868d1e2   Steven Rostedt   ftrace: set up tr...
287
  }
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
288
  static void
f0868d1e2   Steven Rostedt   ftrace: set up tr...
289
290
291
292
293
294
295
296
297
  seq_print_sym_offset(struct trace_seq *s, const char *fmt,
  		     unsigned long address)
  {
  #ifdef CONFIG_KALLSYMS
  	char str[KSYM_SYMBOL_LEN];
  	const char *name;
  
  	sprint_symbol(str, address);
  	name = kretprobed(str);
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
298
  	trace_seq_printf(s, fmt, name);
f0868d1e2   Steven Rostedt   ftrace: set up tr...
299
  #endif
f0868d1e2   Steven Rostedt   ftrace: set up tr...
300
301
302
303
304
305
306
  }
  
  #ifndef CONFIG_64BIT
  # define IP_FMT "%08lx"
  #else
  # define IP_FMT "%016lx"
  #endif
ef92480a5   Steven Rostedt (Red Hat)   tracing: Turn seq...
307
308
  static int seq_print_user_ip(struct trace_seq *s, struct mm_struct *mm,
  			     unsigned long ip, unsigned long sym_flags)
f0868d1e2   Steven Rostedt   ftrace: set up tr...
309
310
311
312
  {
  	struct file *file = NULL;
  	unsigned long vmstart = 0;
  	int ret = 1;
d184b31c0   Johannes Berg   tracing: Add full...
313
314
  	if (s->full)
  		return 0;
f0868d1e2   Steven Rostedt   ftrace: set up tr...
315
316
317
318
319
320
321
322
323
324
325
326
  	if (mm) {
  		const struct vm_area_struct *vma;
  
  		down_read(&mm->mmap_sem);
  		vma = find_vma(mm, ip);
  		if (vma) {
  			file = vma->vm_file;
  			vmstart = vma->vm_start;
  		}
  		if (file) {
  			ret = trace_seq_path(s, &file->f_path);
  			if (ret)
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
327
328
  				trace_seq_printf(s, "[+0x%lx]",
  						 ip - vmstart);
f0868d1e2   Steven Rostedt   ftrace: set up tr...
329
330
331
332
  		}
  		up_read(&mm->mmap_sem);
  	}
  	if (ret && ((sym_flags & TRACE_ITER_SYM_ADDR) || !file))
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
333
334
  		trace_seq_printf(s, " <" IP_FMT ">", ip);
  	return !trace_seq_has_overflowed(s);
f0868d1e2   Steven Rostedt   ftrace: set up tr...
335
336
337
  }
  
  int
f0868d1e2   Steven Rostedt   ftrace: set up tr...
338
339
  seq_print_ip_sym(struct trace_seq *s, unsigned long ip, unsigned long sym_flags)
  {
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
340
341
342
343
  	if (!ip) {
  		trace_seq_putc(s, '0');
  		goto out;
  	}
f0868d1e2   Steven Rostedt   ftrace: set up tr...
344
345
  
  	if (sym_flags & TRACE_ITER_SYM_OFFSET)
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
346
  		seq_print_sym_offset(s, "%s", ip);
f0868d1e2   Steven Rostedt   ftrace: set up tr...
347
  	else
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
348
  		seq_print_sym_short(s, "%s", ip);
f0868d1e2   Steven Rostedt   ftrace: set up tr...
349
350
  
  	if (sym_flags & TRACE_ITER_SYM_ADDR)
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
351
352
353
354
  		trace_seq_printf(s, " <" IP_FMT ">", ip);
  
   out:
  	return !trace_seq_has_overflowed(s);
f0868d1e2   Steven Rostedt   ftrace: set up tr...
355
  }
f81c972d2   Steven Rostedt   tracing: consolid...
356
357
358
359
360
361
  /**
   * trace_print_lat_fmt - print the irq, preempt and lockdep fields
   * @s: trace seq struct to write to
   * @entry: The trace entry field from the ring buffer
   *
   * Prints the generic fields of irqs off, in hard or softirq, preempt
e6e1e2593   Steven Rostedt   tracing: Remove l...
362
   * count.
f81c972d2   Steven Rostedt   tracing: consolid...
363
364
   */
  int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry)
c4a8e8be2   Frederic Weisbecker   trace: better man...
365
  {
10da37a64   David Sharp   tracing: Adjust c...
366
367
368
369
370
  	char hardsoft_irq;
  	char need_resched;
  	char irqs_off;
  	int hardirq;
  	int softirq;
7e6867bf8   Peter Zijlstra   tracing: Record a...
371
  	int nmi;
c4a8e8be2   Frederic Weisbecker   trace: better man...
372

7e6867bf8   Peter Zijlstra   tracing: Record a...
373
  	nmi = entry->flags & TRACE_FLAG_NMI;
c4a8e8be2   Frederic Weisbecker   trace: better man...
374
375
  	hardirq = entry->flags & TRACE_FLAG_HARDIRQ;
  	softirq = entry->flags & TRACE_FLAG_SOFTIRQ;
d9793bd80   Arnaldo Carvalho de Melo   trace: judicious ...
376

10da37a64   David Sharp   tracing: Adjust c...
377
378
379
380
  	irqs_off =
  		(entry->flags & TRACE_FLAG_IRQS_OFF) ? 'd' :
  		(entry->flags & TRACE_FLAG_IRQS_NOSUPPORT) ? 'X' :
  		'.';
e5137b50a   Peter Zijlstra   ftrace, sched: Ad...
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
  
  	switch (entry->flags & (TRACE_FLAG_NEED_RESCHED |
  				TRACE_FLAG_PREEMPT_RESCHED)) {
  	case TRACE_FLAG_NEED_RESCHED | TRACE_FLAG_PREEMPT_RESCHED:
  		need_resched = 'N';
  		break;
  	case TRACE_FLAG_NEED_RESCHED:
  		need_resched = 'n';
  		break;
  	case TRACE_FLAG_PREEMPT_RESCHED:
  		need_resched = 'p';
  		break;
  	default:
  		need_resched = '.';
  		break;
  	}
10da37a64   David Sharp   tracing: Adjust c...
397
  	hardsoft_irq =
7e6867bf8   Peter Zijlstra   tracing: Record a...
398
399
  		(nmi && hardirq)     ? 'Z' :
  		nmi                  ? 'z' :
10da37a64   David Sharp   tracing: Adjust c...
400
  		(hardirq && softirq) ? 'H' :
7e6867bf8   Peter Zijlstra   tracing: Record a...
401
402
403
  		hardirq              ? 'h' :
  		softirq              ? 's' :
  		                       '.' ;
10da37a64   David Sharp   tracing: Adjust c...
404

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
405
406
  	trace_seq_printf(s, "%c%c%c",
  			 irqs_off, need_resched, hardsoft_irq);
c4a8e8be2   Frederic Weisbecker   trace: better man...
407

829b876df   Steven Rostedt   tracing: fix tran...
408
  	if (entry->preempt_count)
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
409
  		trace_seq_printf(s, "%x", entry->preempt_count);
637e7e864   Steven Rostedt   tracing: add lock...
410
  	else
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
411
  		trace_seq_putc(s, '.');
829b876df   Steven Rostedt   tracing: fix tran...
412

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
413
  	return !trace_seq_has_overflowed(s);
c4a8e8be2   Frederic Weisbecker   trace: better man...
414
  }
f81c972d2   Steven Rostedt   tracing: consolid...
415
416
417
418
419
420
  static int
  lat_print_generic(struct trace_seq *s, struct trace_entry *entry, int cpu)
  {
  	char comm[TASK_COMM_LEN];
  
  	trace_find_cmdline(entry->pid, comm);
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
421
422
  	trace_seq_printf(s, "%8.8s-%-5d %3d",
  			 comm, entry->pid, cpu);
f81c972d2   Steven Rostedt   tracing: consolid...
423
424
425
  
  	return trace_print_lat_fmt(s, entry);
  }
8e1e1df29   Byungchul Park   tracing: Add addi...
426
427
428
429
430
431
432
433
  #undef MARK
  #define MARK(v, s) {.val = v, .sym = s}
  /* trace overhead mark */
  static const struct trace_mark {
  	unsigned long long	val; /* unit: nsec */
  	char			sym;
  } mark[] = {
  	MARK(1000000000ULL	, '$'), /* 1 sec */
b838e1d96   Jungseok Lee   tracing: Introduc...
434
435
  	MARK(100000000ULL	, '@'), /* 100 msec */
  	MARK(10000000ULL	, '*'), /* 10 msec */
8e1e1df29   Byungchul Park   tracing: Add addi...
436
437
438
439
440
441
442
443
444
445
446
447
  	MARK(1000000ULL		, '#'), /* 1000 usecs */
  	MARK(100000ULL		, '!'), /* 100 usecs */
  	MARK(10000ULL		, '+'), /* 10 usecs */
  };
  #undef MARK
  
  char trace_find_mark(unsigned long long d)
  {
  	int i;
  	int size = ARRAY_SIZE(mark);
  
  	for (i = 0; i < size; i++) {
b838e1d96   Jungseok Lee   tracing: Introduc...
448
  		if (d > mark[i].val)
8e1e1df29   Byungchul Park   tracing: Add addi...
449
450
451
452
453
  			break;
  	}
  
  	return (i == size) ? ' ' : mark[i].sym;
  }
c4a8e8be2   Frederic Weisbecker   trace: better man...
454

d9793bd80   Arnaldo Carvalho de Melo   trace: judicious ...
455
  static int
8be0709f1   David Sharp   tracing: Format n...
456
  lat_print_timestamp(struct trace_iterator *iter, u64 next_ts)
c4a8e8be2   Frederic Weisbecker   trace: better man...
457
  {
983f938ae   Steven Rostedt (Red Hat)   tracing: Move tra...
458
459
  	struct trace_array *tr = iter->tr;
  	unsigned long verbose = tr->trace_flags & TRACE_ITER_VERBOSE;
8be0709f1   David Sharp   tracing: Format n...
460
  	unsigned long in_ns = iter->iter_flags & TRACE_FILE_TIME_IN_NS;
12883efb6   Steven Rostedt (Red Hat)   tracing: Consolid...
461
  	unsigned long long abs_ts = iter->ts - iter->trace_buffer->time_start;
8be0709f1   David Sharp   tracing: Format n...
462
463
464
465
466
467
468
469
470
471
472
473
474
  	unsigned long long rel_ts = next_ts - iter->ts;
  	struct trace_seq *s = &iter->seq;
  
  	if (in_ns) {
  		abs_ts = ns2usecs(abs_ts);
  		rel_ts = ns2usecs(rel_ts);
  	}
  
  	if (verbose && in_ns) {
  		unsigned long abs_usec = do_div(abs_ts, USEC_PER_MSEC);
  		unsigned long abs_msec = (unsigned long)abs_ts;
  		unsigned long rel_usec = do_div(rel_ts, USEC_PER_MSEC);
  		unsigned long rel_msec = (unsigned long)rel_ts;
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
475
476
477
478
479
  		trace_seq_printf(
  			s, "[%08llx] %ld.%03ldms (+%ld.%03ldms): ",
  			ns2usecs(iter->ts),
  			abs_msec, abs_usec,
  			rel_msec, rel_usec);
8be0709f1   David Sharp   tracing: Format n...
480
  	} else if (verbose && !in_ns) {
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
481
482
483
  		trace_seq_printf(
  			s, "[%016llx] %lld (+%lld): ",
  			iter->ts, abs_ts, rel_ts);
8be0709f1   David Sharp   tracing: Format n...
484
  	} else if (!verbose && in_ns) {
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
485
486
487
  		trace_seq_printf(
  			s, " %4lldus%c: ",
  			abs_ts,
8e1e1df29   Byungchul Park   tracing: Add addi...
488
  			trace_find_mark(rel_ts * NSEC_PER_USEC));
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
489

8be0709f1   David Sharp   tracing: Format n...
490
  	} else { /* !verbose && !in_ns */
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
491
  		trace_seq_printf(s, " %4lld: ", abs_ts);
8be0709f1   David Sharp   tracing: Format n...
492
  	}
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
493
494
  
  	return !trace_seq_has_overflowed(s);
c4a8e8be2   Frederic Weisbecker   trace: better man...
495
496
497
498
  }
  
  int trace_print_context(struct trace_iterator *iter)
  {
983f938ae   Steven Rostedt (Red Hat)   tracing: Move tra...
499
  	struct trace_array *tr = iter->tr;
c4a8e8be2   Frederic Weisbecker   trace: better man...
500
501
  	struct trace_seq *s = &iter->seq;
  	struct trace_entry *entry = iter->ent;
8be0709f1   David Sharp   tracing: Format n...
502
503
  	unsigned long long t;
  	unsigned long secs, usec_rem;
4ca530852   Steven Rostedt   tracing: protect ...
504
505
506
  	char comm[TASK_COMM_LEN];
  
  	trace_find_cmdline(entry->pid, comm);
c4a8e8be2   Frederic Weisbecker   trace: better man...
507

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
508
  	trace_seq_printf(s, "%16s-%-5d [%03d] ",
77271ce4b   Steven Rostedt   tracing: Add irq,...
509
  			       comm, entry->pid, iter->cpu);
77271ce4b   Steven Rostedt   tracing: Add irq,...
510

983f938ae   Steven Rostedt (Red Hat)   tracing: Move tra...
511
  	if (tr->trace_flags & TRACE_ITER_IRQ_INFO)
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
512
  		trace_print_lat_fmt(s, entry);
77271ce4b   Steven Rostedt   tracing: Add irq,...
513

8be0709f1   David Sharp   tracing: Format n...
514
515
516
517
  	if (iter->iter_flags & TRACE_FILE_TIME_IN_NS) {
  		t = ns2usecs(iter->ts);
  		usec_rem = do_div(t, USEC_PER_SEC);
  		secs = (unsigned long)t;
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
518
  		trace_seq_printf(s, " %5lu.%06lu: ", secs, usec_rem);
8be0709f1   David Sharp   tracing: Format n...
519
  	} else
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
520
521
522
  		trace_seq_printf(s, " %12llu: ", iter->ts);
  
  	return !trace_seq_has_overflowed(s);
c4a8e8be2   Frederic Weisbecker   trace: better man...
523
524
525
526
  }
  
  int trace_print_lat_context(struct trace_iterator *iter)
  {
983f938ae   Steven Rostedt (Red Hat)   tracing: Move tra...
527
  	struct trace_array *tr = iter->tr;
db4c75cbe   Steven Rostedt   tracing: Fix stac...
528
529
  	/* trace_find_next_entry will reset ent_size */
  	int ent_size = iter->ent_size;
c4a8e8be2   Frederic Weisbecker   trace: better man...
530
  	struct trace_seq *s = &iter->seq;
983f938ae   Steven Rostedt (Red Hat)   tracing: Move tra...
531
  	u64 next_ts;
c4a8e8be2   Frederic Weisbecker   trace: better man...
532
533
534
  	struct trace_entry *entry = iter->ent,
  			   *next_entry = trace_find_next_entry(iter, NULL,
  							       &next_ts);
983f938ae   Steven Rostedt (Red Hat)   tracing: Move tra...
535
  	unsigned long verbose = (tr->trace_flags & TRACE_ITER_VERBOSE);
c4a8e8be2   Frederic Weisbecker   trace: better man...
536

db4c75cbe   Steven Rostedt   tracing: Fix stac...
537
538
  	/* Restore the original ent_size */
  	iter->ent_size = ent_size;
c4a8e8be2   Frederic Weisbecker   trace: better man...
539
540
  	if (!next_entry)
  		next_ts = iter->ts;
c4a8e8be2   Frederic Weisbecker   trace: better man...
541
542
  
  	if (verbose) {
4ca530852   Steven Rostedt   tracing: protect ...
543
544
545
  		char comm[TASK_COMM_LEN];
  
  		trace_find_cmdline(entry->pid, comm);
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
546
547
548
549
  		trace_seq_printf(
  			s, "%16s %5d %3d %d %08x %08lx ",
  			comm, entry->pid, iter->cpu, entry->flags,
  			entry->preempt_count, iter->idx);
c4a8e8be2   Frederic Weisbecker   trace: better man...
550
  	} else {
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
551
  		lat_print_generic(s, entry, iter->cpu);
c4a8e8be2   Frederic Weisbecker   trace: better man...
552
  	}
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
553
  	lat_print_timestamp(iter, next_ts);
8be0709f1   David Sharp   tracing: Format n...
554

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
555
  	return !trace_seq_has_overflowed(s);
c4a8e8be2   Frederic Weisbecker   trace: better man...
556
  }
f633cef02   Steven Rostedt   ftrace: change tr...
557
558
559
560
561
562
563
564
  static const char state_to_char[] = TASK_STATE_TO_CHAR_STR;
  
  static int task_state_char(unsigned long state)
  {
  	int bit = state ? __ffs(state) + 1 : 0;
  
  	return bit < sizeof(state_to_char) - 1 ? state_to_char[bit] : '?';
  }
f0868d1e2   Steven Rostedt   ftrace: set up tr...
565
566
567
568
569
  /**
   * ftrace_find_event - find a registered event
   * @type: the type of event to look for
   *
   * Returns an event of type @type otherwise NULL
4f5359685   Lai Jiangshan   tracing: add trac...
570
   * Called with trace_event_read_lock() held.
f0868d1e2   Steven Rostedt   ftrace: set up tr...
571
572
573
574
   */
  struct trace_event *ftrace_find_event(int type)
  {
  	struct trace_event *event;
f0868d1e2   Steven Rostedt   ftrace: set up tr...
575
576
577
  	unsigned key;
  
  	key = type & (EVENT_HASHSIZE - 1);
b67bfe0d4   Sasha Levin   hlist: drop the n...
578
  	hlist_for_each_entry(event, &event_hash[key], node) {
f0868d1e2   Steven Rostedt   ftrace: set up tr...
579
580
581
582
583
584
  		if (event->type == type)
  			return event;
  	}
  
  	return NULL;
  }
060fa5c83   Steven Rostedt   tracing/events: r...
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
  static LIST_HEAD(ftrace_event_list);
  
  static int trace_search_list(struct list_head **list)
  {
  	struct trace_event *e;
  	int last = __TRACE_LAST_TYPE;
  
  	if (list_empty(&ftrace_event_list)) {
  		*list = &ftrace_event_list;
  		return last + 1;
  	}
  
  	/*
  	 * We used up all possible max events,
  	 * lets see if somebody freed one.
  	 */
  	list_for_each_entry(e, &ftrace_event_list, list) {
  		if (e->type != last + 1)
  			break;
  		last++;
  	}
  
  	/* Did we used up all 65 thousand events??? */
609a74045   Steven Rostedt (Red Hat)   tracing: Rename F...
608
  	if ((last + 1) > TRACE_EVENT_TYPE_MAX)
060fa5c83   Steven Rostedt   tracing/events: r...
609
610
611
612
613
  		return 0;
  
  	*list = &e->list;
  	return last + 1;
  }
4f5359685   Lai Jiangshan   tracing: add trac...
614
615
  void trace_event_read_lock(void)
  {
52f6ad6dc   zhangwei(Jovi)   tracing: Rename t...
616
  	down_read(&trace_event_sem);
4f5359685   Lai Jiangshan   tracing: add trac...
617
618
619
620
  }
  
  void trace_event_read_unlock(void)
  {
52f6ad6dc   zhangwei(Jovi)   tracing: Rename t...
621
  	up_read(&trace_event_sem);
4f5359685   Lai Jiangshan   tracing: add trac...
622
  }
f0868d1e2   Steven Rostedt   ftrace: set up tr...
623
  /**
9023c9309   Steven Rostedt (Red Hat)   tracing: Rename (...
624
   * register_trace_event - register output for an event type
f0868d1e2   Steven Rostedt   ftrace: set up tr...
625
626
627
628
629
630
631
632
633
634
635
636
637
   * @event: the event type to register
   *
   * Event types are stored in a hash and this hash is used to
   * find a way to print an event. If the @event->type is set
   * then it will use that type, otherwise it will assign a
   * type to use.
   *
   * If you assign your own type, please make sure it is added
   * to the trace_type enum in trace.h, to avoid collisions
   * with the dynamic types.
   *
   * Returns the event type number or zero on error.
   */
9023c9309   Steven Rostedt (Red Hat)   tracing: Rename (...
638
  int register_trace_event(struct trace_event *event)
f0868d1e2   Steven Rostedt   ftrace: set up tr...
639
640
641
  {
  	unsigned key;
  	int ret = 0;
52f6ad6dc   zhangwei(Jovi)   tracing: Rename t...
642
  	down_write(&trace_event_sem);
f0868d1e2   Steven Rostedt   ftrace: set up tr...
643

060fa5c83   Steven Rostedt   tracing/events: r...
644
  	if (WARN_ON(!event))
28bea271e   Peter Zijlstra   ftrace: ensure ev...
645
  		goto out;
28bea271e   Peter Zijlstra   ftrace: ensure ev...
646

a9a577638   Steven Rostedt   tracing: Allow ev...
647
648
  	if (WARN_ON(!event->funcs))
  		goto out;
060fa5c83   Steven Rostedt   tracing/events: r...
649
650
651
  	INIT_LIST_HEAD(&event->list);
  
  	if (!event->type) {
48dd0fed9   Jaswinder Singh Rajput   tracing: trace_ou...
652
  		struct list_head *list = NULL;
060fa5c83   Steven Rostedt   tracing/events: r...
653

609a74045   Steven Rostedt (Red Hat)   tracing: Rename F...
654
  		if (next_event_type > TRACE_EVENT_TYPE_MAX) {
060fa5c83   Steven Rostedt   tracing/events: r...
655
656
657
658
659
660
  
  			event->type = trace_search_list(&list);
  			if (!event->type)
  				goto out;
  
  		} else {
8e1e1df29   Byungchul Park   tracing: Add addi...
661

060fa5c83   Steven Rostedt   tracing/events: r...
662
663
664
665
666
667
668
669
670
671
  			event->type = next_event_type++;
  			list = &ftrace_event_list;
  		}
  
  		if (WARN_ON(ftrace_find_event(event->type)))
  			goto out;
  
  		list_add_tail(&event->list, list);
  
  	} else if (event->type > __TRACE_LAST_TYPE) {
f0868d1e2   Steven Rostedt   ftrace: set up tr...
672
673
674
  		printk(KERN_WARNING "Need to add type to trace.h
  ");
  		WARN_ON(1);
f0868d1e2   Steven Rostedt   ftrace: set up tr...
675
  		goto out;
060fa5c83   Steven Rostedt   tracing/events: r...
676
677
678
679
680
  	} else {
  		/* Is this event already used */
  		if (ftrace_find_event(event->type))
  			goto out;
  	}
f0868d1e2   Steven Rostedt   ftrace: set up tr...
681

a9a577638   Steven Rostedt   tracing: Allow ev...
682
683
684
685
686
687
688
689
  	if (event->funcs->trace == NULL)
  		event->funcs->trace = trace_nop_print;
  	if (event->funcs->raw == NULL)
  		event->funcs->raw = trace_nop_print;
  	if (event->funcs->hex == NULL)
  		event->funcs->hex = trace_nop_print;
  	if (event->funcs->binary == NULL)
  		event->funcs->binary = trace_nop_print;
268ccda0c   Arnaldo Carvalho de Melo   trace: assign def...
690

f0868d1e2   Steven Rostedt   ftrace: set up tr...
691
  	key = event->type & (EVENT_HASHSIZE - 1);
4f5359685   Lai Jiangshan   tracing: add trac...
692
  	hlist_add_head(&event->node, &event_hash[key]);
f0868d1e2   Steven Rostedt   ftrace: set up tr...
693
694
695
  
  	ret = event->type;
   out:
52f6ad6dc   zhangwei(Jovi)   tracing: Rename t...
696
  	up_write(&trace_event_sem);
f0868d1e2   Steven Rostedt   ftrace: set up tr...
697
698
699
  
  	return ret;
  }
9023c9309   Steven Rostedt (Red Hat)   tracing: Rename (...
700
  EXPORT_SYMBOL_GPL(register_trace_event);
f0868d1e2   Steven Rostedt   ftrace: set up tr...
701

110bf2b76   Steven Rostedt   tracing: add prot...
702
  /*
52f6ad6dc   zhangwei(Jovi)   tracing: Rename t...
703
   * Used by module code with the trace_event_sem held for write.
110bf2b76   Steven Rostedt   tracing: add prot...
704
   */
9023c9309   Steven Rostedt (Red Hat)   tracing: Rename (...
705
  int __unregister_trace_event(struct trace_event *event)
110bf2b76   Steven Rostedt   tracing: add prot...
706
707
708
709
710
  {
  	hlist_del(&event->node);
  	list_del(&event->list);
  	return 0;
  }
f0868d1e2   Steven Rostedt   ftrace: set up tr...
711
  /**
9023c9309   Steven Rostedt (Red Hat)   tracing: Rename (...
712
   * unregister_trace_event - remove a no longer used event
f0868d1e2   Steven Rostedt   ftrace: set up tr...
713
714
   * @event: the event to remove
   */
9023c9309   Steven Rostedt (Red Hat)   tracing: Rename (...
715
  int unregister_trace_event(struct trace_event *event)
f0868d1e2   Steven Rostedt   ftrace: set up tr...
716
  {
52f6ad6dc   zhangwei(Jovi)   tracing: Rename t...
717
  	down_write(&trace_event_sem);
9023c9309   Steven Rostedt (Red Hat)   tracing: Rename (...
718
  	__unregister_trace_event(event);
52f6ad6dc   zhangwei(Jovi)   tracing: Rename t...
719
  	up_write(&trace_event_sem);
f0868d1e2   Steven Rostedt   ftrace: set up tr...
720
721
722
  
  	return 0;
  }
9023c9309   Steven Rostedt (Red Hat)   tracing: Rename (...
723
  EXPORT_SYMBOL_GPL(unregister_trace_event);
f633cef02   Steven Rostedt   ftrace: change tr...
724
725
726
727
  
  /*
   * Standard events
   */
a9a577638   Steven Rostedt   tracing: Allow ev...
728
729
  enum print_line_t trace_nop_print(struct trace_iterator *iter, int flags,
  				  struct trace_event *event)
f633cef02   Steven Rostedt   ftrace: change tr...
730
  {
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
731
732
  	trace_seq_printf(&iter->seq, "type: %d
  ", iter->ent->type);
ee5e51f51   Jiri Olsa   tracing: Avoid so...
733

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
734
  	return trace_handle_return(&iter->seq);
f633cef02   Steven Rostedt   ftrace: change tr...
735
736
737
  }
  
  /* TRACE_FN */
a9a577638   Steven Rostedt   tracing: Allow ev...
738
739
  static enum print_line_t trace_fn_trace(struct trace_iterator *iter, int flags,
  					struct trace_event *event)
f633cef02   Steven Rostedt   ftrace: change tr...
740
741
  {
  	struct ftrace_entry *field;
2c9b238eb   Arnaldo Carvalho de Melo   trace: Change str...
742
  	struct trace_seq *s = &iter->seq;
f633cef02   Steven Rostedt   ftrace: change tr...
743

2c9b238eb   Arnaldo Carvalho de Melo   trace: Change str...
744
  	trace_assign_type(field, iter->ent);
f633cef02   Steven Rostedt   ftrace: change tr...
745

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
746
  	seq_print_ip_sym(s, field->ip, flags);
f633cef02   Steven Rostedt   ftrace: change tr...
747
748
  
  	if ((flags & TRACE_ITER_PRINT_PARENT) && field->parent_ip) {
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
749
750
  		trace_seq_puts(s, " <-");
  		seq_print_ip_sym(s, field->parent_ip, flags);
f633cef02   Steven Rostedt   ftrace: change tr...
751
  	}
f633cef02   Steven Rostedt   ftrace: change tr...
752

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
753
754
  	trace_seq_putc(s, '
  ');
f633cef02   Steven Rostedt   ftrace: change tr...
755

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
756
  	return trace_handle_return(s);
f633cef02   Steven Rostedt   ftrace: change tr...
757
  }
a9a577638   Steven Rostedt   tracing: Allow ev...
758
759
  static enum print_line_t trace_fn_raw(struct trace_iterator *iter, int flags,
  				      struct trace_event *event)
f633cef02   Steven Rostedt   ftrace: change tr...
760
761
  {
  	struct ftrace_entry *field;
2c9b238eb   Arnaldo Carvalho de Melo   trace: Change str...
762
  	trace_assign_type(field, iter->ent);
f633cef02   Steven Rostedt   ftrace: change tr...
763

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
764
765
766
767
  	trace_seq_printf(&iter->seq, "%lx %lx
  ",
  			 field->ip,
  			 field->parent_ip);
f633cef02   Steven Rostedt   ftrace: change tr...
768

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
769
  	return trace_handle_return(&iter->seq);
f633cef02   Steven Rostedt   ftrace: change tr...
770
  }
a9a577638   Steven Rostedt   tracing: Allow ev...
771
772
  static enum print_line_t trace_fn_hex(struct trace_iterator *iter, int flags,
  				      struct trace_event *event)
f633cef02   Steven Rostedt   ftrace: change tr...
773
774
  {
  	struct ftrace_entry *field;
2c9b238eb   Arnaldo Carvalho de Melo   trace: Change str...
775
  	struct trace_seq *s = &iter->seq;
f633cef02   Steven Rostedt   ftrace: change tr...
776

2c9b238eb   Arnaldo Carvalho de Melo   trace: Change str...
777
  	trace_assign_type(field, iter->ent);
f633cef02   Steven Rostedt   ftrace: change tr...
778

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
779
780
  	SEQ_PUT_HEX_FIELD(s, field->ip);
  	SEQ_PUT_HEX_FIELD(s, field->parent_ip);
f633cef02   Steven Rostedt   ftrace: change tr...
781

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
782
  	return trace_handle_return(s);
f633cef02   Steven Rostedt   ftrace: change tr...
783
  }
a9a577638   Steven Rostedt   tracing: Allow ev...
784
785
  static enum print_line_t trace_fn_bin(struct trace_iterator *iter, int flags,
  				      struct trace_event *event)
f633cef02   Steven Rostedt   ftrace: change tr...
786
787
  {
  	struct ftrace_entry *field;
2c9b238eb   Arnaldo Carvalho de Melo   trace: Change str...
788
  	struct trace_seq *s = &iter->seq;
f633cef02   Steven Rostedt   ftrace: change tr...
789

2c9b238eb   Arnaldo Carvalho de Melo   trace: Change str...
790
  	trace_assign_type(field, iter->ent);
f633cef02   Steven Rostedt   ftrace: change tr...
791

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
792
793
  	SEQ_PUT_FIELD(s, field->ip);
  	SEQ_PUT_FIELD(s, field->parent_ip);
f633cef02   Steven Rostedt   ftrace: change tr...
794

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
795
  	return trace_handle_return(s);
f633cef02   Steven Rostedt   ftrace: change tr...
796
  }
a9a577638   Steven Rostedt   tracing: Allow ev...
797
  static struct trace_event_functions trace_fn_funcs = {
f633cef02   Steven Rostedt   ftrace: change tr...
798
  	.trace		= trace_fn_trace,
f633cef02   Steven Rostedt   ftrace: change tr...
799
800
801
802
  	.raw		= trace_fn_raw,
  	.hex		= trace_fn_hex,
  	.binary		= trace_fn_bin,
  };
a9a577638   Steven Rostedt   tracing: Allow ev...
803
804
805
806
  static struct trace_event trace_fn_event = {
  	.type		= TRACE_FN,
  	.funcs		= &trace_fn_funcs,
  };
f633cef02   Steven Rostedt   ftrace: change tr...
807
  /* TRACE_CTX an TRACE_WAKE */
ae7462b4f   Arnaldo Carvalho de Melo   trace: make the t...
808
809
  static enum print_line_t trace_ctxwake_print(struct trace_iterator *iter,
  					     char *delim)
f633cef02   Steven Rostedt   ftrace: change tr...
810
811
  {
  	struct ctx_switch_entry *field;
4ca530852   Steven Rostedt   tracing: protect ...
812
  	char comm[TASK_COMM_LEN];
f633cef02   Steven Rostedt   ftrace: change tr...
813
  	int S, T;
4ca530852   Steven Rostedt   tracing: protect ...
814

2c9b238eb   Arnaldo Carvalho de Melo   trace: Change str...
815
  	trace_assign_type(field, iter->ent);
f633cef02   Steven Rostedt   ftrace: change tr...
816
817
818
  
  	T = task_state_char(field->next_state);
  	S = task_state_char(field->prev_state);
4ca530852   Steven Rostedt   tracing: protect ...
819
  	trace_find_cmdline(field->next_pid, comm);
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
820
821
822
823
824
825
826
827
828
829
830
831
  	trace_seq_printf(&iter->seq,
  			 " %5d:%3d:%c %s [%03d] %5d:%3d:%c %s
  ",
  			 field->prev_pid,
  			 field->prev_prio,
  			 S, delim,
  			 field->next_cpu,
  			 field->next_pid,
  			 field->next_prio,
  			 T, comm);
  
  	return trace_handle_return(&iter->seq);
f633cef02   Steven Rostedt   ftrace: change tr...
832
  }
a9a577638   Steven Rostedt   tracing: Allow ev...
833
834
  static enum print_line_t trace_ctx_print(struct trace_iterator *iter, int flags,
  					 struct trace_event *event)
f633cef02   Steven Rostedt   ftrace: change tr...
835
  {
2c9b238eb   Arnaldo Carvalho de Melo   trace: Change str...
836
  	return trace_ctxwake_print(iter, "==>");
f633cef02   Steven Rostedt   ftrace: change tr...
837
  }
ae7462b4f   Arnaldo Carvalho de Melo   trace: make the t...
838
  static enum print_line_t trace_wake_print(struct trace_iterator *iter,
a9a577638   Steven Rostedt   tracing: Allow ev...
839
  					  int flags, struct trace_event *event)
f633cef02   Steven Rostedt   ftrace: change tr...
840
  {
2c9b238eb   Arnaldo Carvalho de Melo   trace: Change str...
841
  	return trace_ctxwake_print(iter, "  +");
f633cef02   Steven Rostedt   ftrace: change tr...
842
  }
2c9b238eb   Arnaldo Carvalho de Melo   trace: Change str...
843
  static int trace_ctxwake_raw(struct trace_iterator *iter, char S)
f633cef02   Steven Rostedt   ftrace: change tr...
844
845
846
  {
  	struct ctx_switch_entry *field;
  	int T;
2c9b238eb   Arnaldo Carvalho de Melo   trace: Change str...
847
  	trace_assign_type(field, iter->ent);
f633cef02   Steven Rostedt   ftrace: change tr...
848
849
  
  	if (!S)
b0f56f1a6   Hiroshi Shimamoto   trace: Fix missin...
850
  		S = task_state_char(field->prev_state);
f633cef02   Steven Rostedt   ftrace: change tr...
851
  	T = task_state_char(field->next_state);
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
852
853
854
855
856
857
858
859
860
861
862
  	trace_seq_printf(&iter->seq, "%d %d %c %d %d %d %c
  ",
  			 field->prev_pid,
  			 field->prev_prio,
  			 S,
  			 field->next_cpu,
  			 field->next_pid,
  			 field->next_prio,
  			 T);
  
  	return trace_handle_return(&iter->seq);
f633cef02   Steven Rostedt   ftrace: change tr...
863
  }
a9a577638   Steven Rostedt   tracing: Allow ev...
864
865
  static enum print_line_t trace_ctx_raw(struct trace_iterator *iter, int flags,
  				       struct trace_event *event)
f633cef02   Steven Rostedt   ftrace: change tr...
866
  {
2c9b238eb   Arnaldo Carvalho de Melo   trace: Change str...
867
  	return trace_ctxwake_raw(iter, 0);
f633cef02   Steven Rostedt   ftrace: change tr...
868
  }
a9a577638   Steven Rostedt   tracing: Allow ev...
869
870
  static enum print_line_t trace_wake_raw(struct trace_iterator *iter, int flags,
  					struct trace_event *event)
f633cef02   Steven Rostedt   ftrace: change tr...
871
  {
2c9b238eb   Arnaldo Carvalho de Melo   trace: Change str...
872
  	return trace_ctxwake_raw(iter, '+');
f633cef02   Steven Rostedt   ftrace: change tr...
873
  }
2c9b238eb   Arnaldo Carvalho de Melo   trace: Change str...
874
  static int trace_ctxwake_hex(struct trace_iterator *iter, char S)
f633cef02   Steven Rostedt   ftrace: change tr...
875
876
  {
  	struct ctx_switch_entry *field;
2c9b238eb   Arnaldo Carvalho de Melo   trace: Change str...
877
  	struct trace_seq *s = &iter->seq;
f633cef02   Steven Rostedt   ftrace: change tr...
878
  	int T;
2c9b238eb   Arnaldo Carvalho de Melo   trace: Change str...
879
  	trace_assign_type(field, iter->ent);
f633cef02   Steven Rostedt   ftrace: change tr...
880
881
  
  	if (!S)
b0f56f1a6   Hiroshi Shimamoto   trace: Fix missin...
882
  		S = task_state_char(field->prev_state);
f633cef02   Steven Rostedt   ftrace: change tr...
883
  	T = task_state_char(field->next_state);
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
884
885
886
887
888
889
890
  	SEQ_PUT_HEX_FIELD(s, field->prev_pid);
  	SEQ_PUT_HEX_FIELD(s, field->prev_prio);
  	SEQ_PUT_HEX_FIELD(s, S);
  	SEQ_PUT_HEX_FIELD(s, field->next_cpu);
  	SEQ_PUT_HEX_FIELD(s, field->next_pid);
  	SEQ_PUT_HEX_FIELD(s, field->next_prio);
  	SEQ_PUT_HEX_FIELD(s, T);
f633cef02   Steven Rostedt   ftrace: change tr...
891

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
892
  	return trace_handle_return(s);
f633cef02   Steven Rostedt   ftrace: change tr...
893
  }
a9a577638   Steven Rostedt   tracing: Allow ev...
894
895
  static enum print_line_t trace_ctx_hex(struct trace_iterator *iter, int flags,
  				       struct trace_event *event)
f633cef02   Steven Rostedt   ftrace: change tr...
896
  {
2c9b238eb   Arnaldo Carvalho de Melo   trace: Change str...
897
  	return trace_ctxwake_hex(iter, 0);
f633cef02   Steven Rostedt   ftrace: change tr...
898
  }
a9a577638   Steven Rostedt   tracing: Allow ev...
899
900
  static enum print_line_t trace_wake_hex(struct trace_iterator *iter, int flags,
  					struct trace_event *event)
f633cef02   Steven Rostedt   ftrace: change tr...
901
  {
2c9b238eb   Arnaldo Carvalho de Melo   trace: Change str...
902
  	return trace_ctxwake_hex(iter, '+');
f633cef02   Steven Rostedt   ftrace: change tr...
903
  }
ae7462b4f   Arnaldo Carvalho de Melo   trace: make the t...
904
  static enum print_line_t trace_ctxwake_bin(struct trace_iterator *iter,
a9a577638   Steven Rostedt   tracing: Allow ev...
905
  					   int flags, struct trace_event *event)
f633cef02   Steven Rostedt   ftrace: change tr...
906
907
  {
  	struct ctx_switch_entry *field;
2c9b238eb   Arnaldo Carvalho de Melo   trace: Change str...
908
  	struct trace_seq *s = &iter->seq;
f633cef02   Steven Rostedt   ftrace: change tr...
909

2c9b238eb   Arnaldo Carvalho de Melo   trace: Change str...
910
  	trace_assign_type(field, iter->ent);
f633cef02   Steven Rostedt   ftrace: change tr...
911

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
912
913
914
915
916
917
918
  	SEQ_PUT_FIELD(s, field->prev_pid);
  	SEQ_PUT_FIELD(s, field->prev_prio);
  	SEQ_PUT_FIELD(s, field->prev_state);
  	SEQ_PUT_FIELD(s, field->next_cpu);
  	SEQ_PUT_FIELD(s, field->next_pid);
  	SEQ_PUT_FIELD(s, field->next_prio);
  	SEQ_PUT_FIELD(s, field->next_state);
f633cef02   Steven Rostedt   ftrace: change tr...
919

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
920
  	return trace_handle_return(s);
f633cef02   Steven Rostedt   ftrace: change tr...
921
  }
a9a577638   Steven Rostedt   tracing: Allow ev...
922
  static struct trace_event_functions trace_ctx_funcs = {
f633cef02   Steven Rostedt   ftrace: change tr...
923
  	.trace		= trace_ctx_print,
f633cef02   Steven Rostedt   ftrace: change tr...
924
925
926
927
  	.raw		= trace_ctx_raw,
  	.hex		= trace_ctx_hex,
  	.binary		= trace_ctxwake_bin,
  };
a9a577638   Steven Rostedt   tracing: Allow ev...
928
929
930
931
932
933
  static struct trace_event trace_ctx_event = {
  	.type		= TRACE_CTX,
  	.funcs		= &trace_ctx_funcs,
  };
  
  static struct trace_event_functions trace_wake_funcs = {
f633cef02   Steven Rostedt   ftrace: change tr...
934
  	.trace		= trace_wake_print,
f633cef02   Steven Rostedt   ftrace: change tr...
935
936
937
938
  	.raw		= trace_wake_raw,
  	.hex		= trace_wake_hex,
  	.binary		= trace_ctxwake_bin,
  };
a9a577638   Steven Rostedt   tracing: Allow ev...
939
940
941
942
  static struct trace_event trace_wake_event = {
  	.type		= TRACE_WAKE,
  	.funcs		= &trace_wake_funcs,
  };
f633cef02   Steven Rostedt   ftrace: change tr...
943
  /* TRACE_STACK */
ae7462b4f   Arnaldo Carvalho de Melo   trace: make the t...
944
  static enum print_line_t trace_stack_print(struct trace_iterator *iter,
a9a577638   Steven Rostedt   tracing: Allow ev...
945
  					   int flags, struct trace_event *event)
f633cef02   Steven Rostedt   ftrace: change tr...
946
947
  {
  	struct stack_entry *field;
2c9b238eb   Arnaldo Carvalho de Melo   trace: Change str...
948
  	struct trace_seq *s = &iter->seq;
4a9bd3f13   Steven Rostedt   tracing: Have dyn...
949
950
  	unsigned long *p;
  	unsigned long *end;
f633cef02   Steven Rostedt   ftrace: change tr...
951

2c9b238eb   Arnaldo Carvalho de Melo   trace: Change str...
952
  	trace_assign_type(field, iter->ent);
4a9bd3f13   Steven Rostedt   tracing: Have dyn...
953
  	end = (unsigned long *)((long)iter->ent + iter->ent_size);
f633cef02   Steven Rostedt   ftrace: change tr...
954

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
955
956
  	trace_seq_puts(s, "<stack trace>
  ");
4a9bd3f13   Steven Rostedt   tracing: Have dyn...
957
958
  
  	for (p = field->caller; p && *p != ULONG_MAX && p < end; p++) {
f633cef02   Steven Rostedt   ftrace: change tr...
959

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
960
961
  		if (trace_seq_has_overflowed(s))
  			break;
f633cef02   Steven Rostedt   ftrace: change tr...
962

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
963
964
965
966
967
  		trace_seq_puts(s, " => ");
  		seq_print_ip_sym(s, *p, flags);
  		trace_seq_putc(s, '
  ');
  	}
f633cef02   Steven Rostedt   ftrace: change tr...
968

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
969
  	return trace_handle_return(s);
f633cef02   Steven Rostedt   ftrace: change tr...
970
  }
a9a577638   Steven Rostedt   tracing: Allow ev...
971
  static struct trace_event_functions trace_stack_funcs = {
f633cef02   Steven Rostedt   ftrace: change tr...
972
  	.trace		= trace_stack_print,
f633cef02   Steven Rostedt   ftrace: change tr...
973
  };
a9a577638   Steven Rostedt   tracing: Allow ev...
974
975
976
977
  static struct trace_event trace_stack_event = {
  	.type		= TRACE_STACK,
  	.funcs		= &trace_stack_funcs,
  };
f633cef02   Steven Rostedt   ftrace: change tr...
978
  /* TRACE_USER_STACK */
ae7462b4f   Arnaldo Carvalho de Melo   trace: make the t...
979
  static enum print_line_t trace_user_stack_print(struct trace_iterator *iter,
a9a577638   Steven Rostedt   tracing: Allow ev...
980
  						int flags, struct trace_event *event)
f633cef02   Steven Rostedt   ftrace: change tr...
981
  {
983f938ae   Steven Rostedt (Red Hat)   tracing: Move tra...
982
  	struct trace_array *tr = iter->tr;
f633cef02   Steven Rostedt   ftrace: change tr...
983
  	struct userstack_entry *field;
2c9b238eb   Arnaldo Carvalho de Melo   trace: Change str...
984
  	struct trace_seq *s = &iter->seq;
6b1032d53   Steven Rostedt (Red Hat)   tracing: Inject s...
985
986
  	struct mm_struct *mm = NULL;
  	unsigned int i;
f633cef02   Steven Rostedt   ftrace: change tr...
987

2c9b238eb   Arnaldo Carvalho de Melo   trace: Change str...
988
  	trace_assign_type(field, iter->ent);
f633cef02   Steven Rostedt   ftrace: change tr...
989

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
990
991
  	trace_seq_puts(s, "<user stack trace>
  ");
6b1032d53   Steven Rostedt (Red Hat)   tracing: Inject s...
992

983f938ae   Steven Rostedt (Red Hat)   tracing: Move tra...
993
  	if (tr->trace_flags & TRACE_ITER_SYM_USEROBJ) {
6b1032d53   Steven Rostedt (Red Hat)   tracing: Inject s...
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
  		struct task_struct *task;
  		/*
  		 * we do the lookup on the thread group leader,
  		 * since individual threads might have already quit!
  		 */
  		rcu_read_lock();
  		task = find_task_by_vpid(field->tgid);
  		if (task)
  			mm = get_task_mm(task);
  		rcu_read_unlock();
  	}
  
  	for (i = 0; i < FTRACE_STACK_ENTRIES; i++) {
  		unsigned long ip = field->caller[i];
  
  		if (ip == ULONG_MAX || trace_seq_has_overflowed(s))
  			break;
  
  		trace_seq_puts(s, " => ");
  
  		if (!ip) {
  			trace_seq_puts(s, "??");
  			trace_seq_putc(s, '
  ');
  			continue;
  		}
  
  		seq_print_user_ip(s, mm, ip, flags);
  		trace_seq_putc(s, '
  ');
  	}
  
  	if (mm)
  		mmput(mm);
f633cef02   Steven Rostedt   ftrace: change tr...
1028

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
1029
  	return trace_handle_return(s);
f633cef02   Steven Rostedt   ftrace: change tr...
1030
  }
a9a577638   Steven Rostedt   tracing: Allow ev...
1031
  static struct trace_event_functions trace_user_stack_funcs = {
f633cef02   Steven Rostedt   ftrace: change tr...
1032
  	.trace		= trace_user_stack_print,
f633cef02   Steven Rostedt   ftrace: change tr...
1033
  };
a9a577638   Steven Rostedt   tracing: Allow ev...
1034
1035
1036
1037
  static struct trace_event trace_user_stack_event = {
  	.type		= TRACE_USER_STACK,
  	.funcs		= &trace_user_stack_funcs,
  };
09ae72348   Steven Rostedt (Red Hat)   tracing: Add trac...
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
  /* TRACE_BPUTS */
  static enum print_line_t
  trace_bputs_print(struct trace_iterator *iter, int flags,
  		   struct trace_event *event)
  {
  	struct trace_entry *entry = iter->ent;
  	struct trace_seq *s = &iter->seq;
  	struct bputs_entry *field;
  
  	trace_assign_type(field, entry);
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
1048
1049
1050
  	seq_print_ip_sym(s, field->ip, flags);
  	trace_seq_puts(s, ": ");
  	trace_seq_puts(s, field->str);
09ae72348   Steven Rostedt (Red Hat)   tracing: Add trac...
1051

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
1052
  	return trace_handle_return(s);
09ae72348   Steven Rostedt (Red Hat)   tracing: Add trac...
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
  }
  
  
  static enum print_line_t
  trace_bputs_raw(struct trace_iterator *iter, int flags,
  		struct trace_event *event)
  {
  	struct bputs_entry *field;
  	struct trace_seq *s = &iter->seq;
  
  	trace_assign_type(field, iter->ent);
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
1064
1065
  	trace_seq_printf(s, ": %lx : ", field->ip);
  	trace_seq_puts(s, field->str);
09ae72348   Steven Rostedt (Red Hat)   tracing: Add trac...
1066

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
1067
  	return trace_handle_return(s);
09ae72348   Steven Rostedt (Red Hat)   tracing: Add trac...
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
  }
  
  static struct trace_event_functions trace_bputs_funcs = {
  	.trace		= trace_bputs_print,
  	.raw		= trace_bputs_raw,
  };
  
  static struct trace_event trace_bputs_event = {
  	.type		= TRACE_BPUTS,
  	.funcs		= &trace_bputs_funcs,
  };
48ead0203   Frederic Weisbecker   tracing/core: bri...
1079
  /* TRACE_BPRINT */
1427cdf05   Lai Jiangshan   tracing: infrastr...
1080
  static enum print_line_t
a9a577638   Steven Rostedt   tracing: Allow ev...
1081
1082
  trace_bprint_print(struct trace_iterator *iter, int flags,
  		   struct trace_event *event)
1427cdf05   Lai Jiangshan   tracing: infrastr...
1083
1084
1085
  {
  	struct trace_entry *entry = iter->ent;
  	struct trace_seq *s = &iter->seq;
48ead0203   Frederic Weisbecker   tracing/core: bri...
1086
  	struct bprint_entry *field;
1427cdf05   Lai Jiangshan   tracing: infrastr...
1087
1088
  
  	trace_assign_type(field, entry);
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
1089
1090
1091
  	seq_print_ip_sym(s, field->ip, flags);
  	trace_seq_puts(s, ": ");
  	trace_seq_bprintf(s, field->fmt, field->buf);
1427cdf05   Lai Jiangshan   tracing: infrastr...
1092

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
1093
  	return trace_handle_return(s);
1427cdf05   Lai Jiangshan   tracing: infrastr...
1094
  }
769b0441f   Frederic Weisbecker   tracing/core: dro...
1095

48ead0203   Frederic Weisbecker   tracing/core: bri...
1096
  static enum print_line_t
a9a577638   Steven Rostedt   tracing: Allow ev...
1097
1098
  trace_bprint_raw(struct trace_iterator *iter, int flags,
  		 struct trace_event *event)
1427cdf05   Lai Jiangshan   tracing: infrastr...
1099
  {
48ead0203   Frederic Weisbecker   tracing/core: bri...
1100
  	struct bprint_entry *field;
1427cdf05   Lai Jiangshan   tracing: infrastr...
1101
  	struct trace_seq *s = &iter->seq;
1427cdf05   Lai Jiangshan   tracing: infrastr...
1102

769b0441f   Frederic Weisbecker   tracing/core: dro...
1103
  	trace_assign_type(field, iter->ent);
1427cdf05   Lai Jiangshan   tracing: infrastr...
1104

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
1105
1106
  	trace_seq_printf(s, ": %lx : ", field->ip);
  	trace_seq_bprintf(s, field->fmt, field->buf);
1427cdf05   Lai Jiangshan   tracing: infrastr...
1107

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
1108
  	return trace_handle_return(s);
1427cdf05   Lai Jiangshan   tracing: infrastr...
1109
  }
a9a577638   Steven Rostedt   tracing: Allow ev...
1110
1111
1112
1113
  static struct trace_event_functions trace_bprint_funcs = {
  	.trace		= trace_bprint_print,
  	.raw		= trace_bprint_raw,
  };
769b0441f   Frederic Weisbecker   tracing/core: dro...
1114

48ead0203   Frederic Weisbecker   tracing/core: bri...
1115
1116
  static struct trace_event trace_bprint_event = {
  	.type		= TRACE_BPRINT,
a9a577638   Steven Rostedt   tracing: Allow ev...
1117
  	.funcs		= &trace_bprint_funcs,
48ead0203   Frederic Weisbecker   tracing/core: bri...
1118
1119
1120
1121
  };
  
  /* TRACE_PRINT */
  static enum print_line_t trace_print_print(struct trace_iterator *iter,
a9a577638   Steven Rostedt   tracing: Allow ev...
1122
  					   int flags, struct trace_event *event)
48ead0203   Frederic Weisbecker   tracing/core: bri...
1123
1124
1125
1126
1127
  {
  	struct print_entry *field;
  	struct trace_seq *s = &iter->seq;
  
  	trace_assign_type(field, iter->ent);
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
1128
1129
  	seq_print_ip_sym(s, field->ip, flags);
  	trace_seq_printf(s, ": %s", field->buf);
48ead0203   Frederic Weisbecker   tracing/core: bri...
1130

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
1131
  	return trace_handle_return(s);
48ead0203   Frederic Weisbecker   tracing/core: bri...
1132
  }
a9a577638   Steven Rostedt   tracing: Allow ev...
1133
1134
  static enum print_line_t trace_print_raw(struct trace_iterator *iter, int flags,
  					 struct trace_event *event)
48ead0203   Frederic Weisbecker   tracing/core: bri...
1135
1136
1137
1138
  {
  	struct print_entry *field;
  
  	trace_assign_type(field, iter->ent);
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
1139
  	trace_seq_printf(&iter->seq, "# %lx %s", field->ip, field->buf);
48ead0203   Frederic Weisbecker   tracing/core: bri...
1140

19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
1141
  	return trace_handle_return(&iter->seq);
48ead0203   Frederic Weisbecker   tracing/core: bri...
1142
  }
a9a577638   Steven Rostedt   tracing: Allow ev...
1143
  static struct trace_event_functions trace_print_funcs = {
769b0441f   Frederic Weisbecker   tracing/core: dro...
1144
1145
  	.trace		= trace_print_print,
  	.raw		= trace_print_raw,
1427cdf05   Lai Jiangshan   tracing: infrastr...
1146
  };
a9a577638   Steven Rostedt   tracing: Allow ev...
1147
1148
1149
1150
  static struct trace_event trace_print_event = {
  	.type	 	= TRACE_PRINT,
  	.funcs		= &trace_print_funcs,
  };
48ead0203   Frederic Weisbecker   tracing/core: bri...
1151

f633cef02   Steven Rostedt   ftrace: change tr...
1152
1153
1154
1155
  static struct trace_event *events[] __initdata = {
  	&trace_fn_event,
  	&trace_ctx_event,
  	&trace_wake_event,
f633cef02   Steven Rostedt   ftrace: change tr...
1156
1157
  	&trace_stack_event,
  	&trace_user_stack_event,
09ae72348   Steven Rostedt (Red Hat)   tracing: Add trac...
1158
  	&trace_bputs_event,
48ead0203   Frederic Weisbecker   tracing/core: bri...
1159
  	&trace_bprint_event,
f633cef02   Steven Rostedt   ftrace: change tr...
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
  	&trace_print_event,
  	NULL
  };
  
  __init static int init_events(void)
  {
  	struct trace_event *event;
  	int i, ret;
  
  	for (i = 0; events[i]; i++) {
  		event = events[i];
9023c9309   Steven Rostedt (Red Hat)   tracing: Rename (...
1171
  		ret = register_trace_event(event);
f633cef02   Steven Rostedt   ftrace: change tr...
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
  		if (!ret) {
  			printk(KERN_WARNING "event %d failed to register
  ",
  			       event->type);
  			WARN_ON_ONCE(1);
  		}
  	}
  
  	return 0;
  }
7374e8277   Steven Rostedt   tracing: Register...
1182
  early_initcall(init_events);