Merge tag 'drm-fixes-2018-07-16-1' of git://anongit.freedesktop.org/drm/drm
[linux-2.6-microblaze.git] / kernel / trace / trace_output.c
1 /*
2  * trace_output.c
3  *
4  * Copyright (C) 2008 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
5  *
6  */
7 #include <linux/module.h>
8 #include <linux/mutex.h>
9 #include <linux/ftrace.h>
10 #include <linux/sched/clock.h>
11 #include <linux/sched/mm.h>
12
13 #include "trace_output.h"
14
15 /* must be a power of 2 */
16 #define EVENT_HASHSIZE  128
17
18 DECLARE_RWSEM(trace_event_sem);
19
20 static struct hlist_head event_hash[EVENT_HASHSIZE] __read_mostly;
21
22 static int next_event_type = __TRACE_LAST_TYPE + 1;
23
24 enum print_line_t trace_print_bputs_msg_only(struct trace_iterator *iter)
25 {
26         struct trace_seq *s = &iter->seq;
27         struct trace_entry *entry = iter->ent;
28         struct bputs_entry *field;
29
30         trace_assign_type(field, entry);
31
32         trace_seq_puts(s, field->str);
33
34         return trace_handle_return(s);
35 }
36
37 enum print_line_t trace_print_bprintk_msg_only(struct trace_iterator *iter)
38 {
39         struct trace_seq *s = &iter->seq;
40         struct trace_entry *entry = iter->ent;
41         struct bprint_entry *field;
42
43         trace_assign_type(field, entry);
44
45         trace_seq_bprintf(s, field->fmt, field->buf);
46
47         return trace_handle_return(s);
48 }
49
50 enum print_line_t trace_print_printk_msg_only(struct trace_iterator *iter)
51 {
52         struct trace_seq *s = &iter->seq;
53         struct trace_entry *entry = iter->ent;
54         struct print_entry *field;
55
56         trace_assign_type(field, entry);
57
58         trace_seq_puts(s, field->buf);
59
60         return trace_handle_return(s);
61 }
62
63 const char *
64 trace_print_flags_seq(struct trace_seq *p, const char *delim,
65                       unsigned long flags,
66                       const struct trace_print_flags *flag_array)
67 {
68         unsigned long mask;
69         const char *str;
70         const char *ret = trace_seq_buffer_ptr(p);
71         int i, first = 1;
72
73         for (i = 0;  flag_array[i].name && flags; i++) {
74
75                 mask = flag_array[i].mask;
76                 if ((flags & mask) != mask)
77                         continue;
78
79                 str = flag_array[i].name;
80                 flags &= ~mask;
81                 if (!first && delim)
82                         trace_seq_puts(p, delim);
83                 else
84                         first = 0;
85                 trace_seq_puts(p, str);
86         }
87
88         /* check for left over flags */
89         if (flags) {
90                 if (!first && delim)
91                         trace_seq_puts(p, delim);
92                 trace_seq_printf(p, "0x%lx", flags);
93         }
94
95         trace_seq_putc(p, 0);
96
97         return ret;
98 }
99 EXPORT_SYMBOL(trace_print_flags_seq);
100
101 const char *
102 trace_print_symbols_seq(struct trace_seq *p, unsigned long val,
103                         const struct trace_print_flags *symbol_array)
104 {
105         int i;
106         const char *ret = trace_seq_buffer_ptr(p);
107
108         for (i = 0;  symbol_array[i].name; i++) {
109
110                 if (val != symbol_array[i].mask)
111                         continue;
112
113                 trace_seq_puts(p, symbol_array[i].name);
114                 break;
115         }
116
117         if (ret == (const char *)(trace_seq_buffer_ptr(p)))
118                 trace_seq_printf(p, "0x%lx", val);
119
120         trace_seq_putc(p, 0);
121
122         return ret;
123 }
124 EXPORT_SYMBOL(trace_print_symbols_seq);
125
126 #if BITS_PER_LONG == 32
127 const char *
128 trace_print_flags_seq_u64(struct trace_seq *p, const char *delim,
129                       unsigned long long flags,
130                       const struct trace_print_flags_u64 *flag_array)
131 {
132         unsigned long long mask;
133         const char *str;
134         const char *ret = trace_seq_buffer_ptr(p);
135         int i, first = 1;
136
137         for (i = 0;  flag_array[i].name && flags; i++) {
138
139                 mask = flag_array[i].mask;
140                 if ((flags & mask) != mask)
141                         continue;
142
143                 str = flag_array[i].name;
144                 flags &= ~mask;
145                 if (!first && delim)
146                         trace_seq_puts(p, delim);
147                 else
148                         first = 0;
149                 trace_seq_puts(p, str);
150         }
151
152         /* check for left over flags */
153         if (flags) {
154                 if (!first && delim)
155                         trace_seq_puts(p, delim);
156                 trace_seq_printf(p, "0x%llx", flags);
157         }
158
159         trace_seq_putc(p, 0);
160
161         return ret;
162 }
163 EXPORT_SYMBOL(trace_print_flags_seq_u64);
164
165 const char *
166 trace_print_symbols_seq_u64(struct trace_seq *p, unsigned long long val,
167                          const struct trace_print_flags_u64 *symbol_array)
168 {
169         int i;
170         const char *ret = trace_seq_buffer_ptr(p);
171
172         for (i = 0;  symbol_array[i].name; i++) {
173
174                 if (val != symbol_array[i].mask)
175                         continue;
176
177                 trace_seq_puts(p, symbol_array[i].name);
178                 break;
179         }
180
181         if (ret == (const char *)(trace_seq_buffer_ptr(p)))
182                 trace_seq_printf(p, "0x%llx", val);
183
184         trace_seq_putc(p, 0);
185
186         return ret;
187 }
188 EXPORT_SYMBOL(trace_print_symbols_seq_u64);
189 #endif
190
191 const char *
192 trace_print_bitmask_seq(struct trace_seq *p, void *bitmask_ptr,
193                         unsigned int bitmask_size)
194 {
195         const char *ret = trace_seq_buffer_ptr(p);
196
197         trace_seq_bitmask(p, bitmask_ptr, bitmask_size * 8);
198         trace_seq_putc(p, 0);
199
200         return ret;
201 }
202 EXPORT_SYMBOL_GPL(trace_print_bitmask_seq);
203
204 /**
205  * trace_print_hex_seq - print buffer as hex sequence
206  * @p: trace seq struct to write to
207  * @buf: The buffer to print
208  * @buf_len: Length of @buf in bytes
209  * @concatenate: Print @buf as single hex string or with spacing
210  *
211  * Prints the passed buffer as a hex sequence either as a whole,
212  * single hex string if @concatenate is true or with spacing after
213  * each byte in case @concatenate is false.
214  */
215 const char *
216 trace_print_hex_seq(struct trace_seq *p, const unsigned char *buf, int buf_len,
217                     bool concatenate)
218 {
219         int i;
220         const char *ret = trace_seq_buffer_ptr(p);
221
222         for (i = 0; i < buf_len; i++)
223                 trace_seq_printf(p, "%s%2.2x", concatenate || i == 0 ? "" : " ",
224                                  buf[i]);
225         trace_seq_putc(p, 0);
226
227         return ret;
228 }
229 EXPORT_SYMBOL(trace_print_hex_seq);
230
231 const char *
232 trace_print_array_seq(struct trace_seq *p, const void *buf, int count,
233                       size_t el_size)
234 {
235         const char *ret = trace_seq_buffer_ptr(p);
236         const char *prefix = "";
237         void *ptr = (void *)buf;
238         size_t buf_len = count * el_size;
239
240         trace_seq_putc(p, '{');
241
242         while (ptr < buf + buf_len) {
243                 switch (el_size) {
244                 case 1:
245                         trace_seq_printf(p, "%s0x%x", prefix,
246                                          *(u8 *)ptr);
247                         break;
248                 case 2:
249                         trace_seq_printf(p, "%s0x%x", prefix,
250                                          *(u16 *)ptr);
251                         break;
252                 case 4:
253                         trace_seq_printf(p, "%s0x%x", prefix,
254                                          *(u32 *)ptr);
255                         break;
256                 case 8:
257                         trace_seq_printf(p, "%s0x%llx", prefix,
258                                          *(u64 *)ptr);
259                         break;
260                 default:
261                         trace_seq_printf(p, "BAD SIZE:%zu 0x%x", el_size,
262                                          *(u8 *)ptr);
263                         el_size = 1;
264                 }
265                 prefix = ",";
266                 ptr += el_size;
267         }
268
269         trace_seq_putc(p, '}');
270         trace_seq_putc(p, 0);
271
272         return ret;
273 }
274 EXPORT_SYMBOL(trace_print_array_seq);
275
276 int trace_raw_output_prep(struct trace_iterator *iter,
277                           struct trace_event *trace_event)
278 {
279         struct trace_event_call *event;
280         struct trace_seq *s = &iter->seq;
281         struct trace_seq *p = &iter->tmp_seq;
282         struct trace_entry *entry;
283
284         event = container_of(trace_event, struct trace_event_call, event);
285         entry = iter->ent;
286
287         if (entry->type != event->event.type) {
288                 WARN_ON_ONCE(1);
289                 return TRACE_TYPE_UNHANDLED;
290         }
291
292         trace_seq_init(p);
293         trace_seq_printf(s, "%s: ", trace_event_name(event));
294
295         return trace_handle_return(s);
296 }
297 EXPORT_SYMBOL(trace_raw_output_prep);
298
299 static int trace_output_raw(struct trace_iterator *iter, char *name,
300                             char *fmt, va_list ap)
301 {
302         struct trace_seq *s = &iter->seq;
303
304         trace_seq_printf(s, "%s: ", name);
305         trace_seq_vprintf(s, fmt, ap);
306
307         return trace_handle_return(s);
308 }
309
310 int trace_output_call(struct trace_iterator *iter, char *name, char *fmt, ...)
311 {
312         va_list ap;
313         int ret;
314
315         va_start(ap, fmt);
316         ret = trace_output_raw(iter, name, fmt, ap);
317         va_end(ap);
318
319         return ret;
320 }
321 EXPORT_SYMBOL_GPL(trace_output_call);
322
323 #ifdef CONFIG_KRETPROBES
324 static inline const char *kretprobed(const char *name)
325 {
326         static const char tramp_name[] = "kretprobe_trampoline";
327         int size = sizeof(tramp_name);
328
329         if (strncmp(tramp_name, name, size) == 0)
330                 return "[unknown/kretprobe'd]";
331         return name;
332 }
333 #else
334 static inline const char *kretprobed(const char *name)
335 {
336         return name;
337 }
338 #endif /* CONFIG_KRETPROBES */
339
340 static void
341 seq_print_sym_short(struct trace_seq *s, const char *fmt, unsigned long address)
342 {
343         char str[KSYM_SYMBOL_LEN];
344 #ifdef CONFIG_KALLSYMS
345         const char *name;
346
347         kallsyms_lookup(address, NULL, NULL, NULL, str);
348
349         name = kretprobed(str);
350
351         if (name && strlen(name)) {
352                 trace_seq_printf(s, fmt, name);
353                 return;
354         }
355 #endif
356         snprintf(str, KSYM_SYMBOL_LEN, "0x%08lx", address);
357         trace_seq_printf(s, fmt, str);
358 }
359
360 static void
361 seq_print_sym_offset(struct trace_seq *s, const char *fmt,
362                      unsigned long address)
363 {
364         char str[KSYM_SYMBOL_LEN];
365 #ifdef CONFIG_KALLSYMS
366         const char *name;
367
368         sprint_symbol(str, address);
369         name = kretprobed(str);
370
371         if (name && strlen(name)) {
372                 trace_seq_printf(s, fmt, name);
373                 return;
374         }
375 #endif
376         snprintf(str, KSYM_SYMBOL_LEN, "0x%08lx", address);
377         trace_seq_printf(s, fmt, str);
378 }
379
380 #ifndef CONFIG_64BIT
381 # define IP_FMT "%08lx"
382 #else
383 # define IP_FMT "%016lx"
384 #endif
385
386 static int seq_print_user_ip(struct trace_seq *s, struct mm_struct *mm,
387                              unsigned long ip, unsigned long sym_flags)
388 {
389         struct file *file = NULL;
390         unsigned long vmstart = 0;
391         int ret = 1;
392
393         if (s->full)
394                 return 0;
395
396         if (mm) {
397                 const struct vm_area_struct *vma;
398
399                 down_read(&mm->mmap_sem);
400                 vma = find_vma(mm, ip);
401                 if (vma) {
402                         file = vma->vm_file;
403                         vmstart = vma->vm_start;
404                 }
405                 if (file) {
406                         ret = trace_seq_path(s, &file->f_path);
407                         if (ret)
408                                 trace_seq_printf(s, "[+0x%lx]",
409                                                  ip - vmstart);
410                 }
411                 up_read(&mm->mmap_sem);
412         }
413         if (ret && ((sym_flags & TRACE_ITER_SYM_ADDR) || !file))
414                 trace_seq_printf(s, " <" IP_FMT ">", ip);
415         return !trace_seq_has_overflowed(s);
416 }
417
418 int
419 seq_print_ip_sym(struct trace_seq *s, unsigned long ip, unsigned long sym_flags)
420 {
421         if (!ip) {
422                 trace_seq_putc(s, '0');
423                 goto out;
424         }
425
426         if (sym_flags & TRACE_ITER_SYM_OFFSET)
427                 seq_print_sym_offset(s, "%s", ip);
428         else
429                 seq_print_sym_short(s, "%s", ip);
430
431         if (sym_flags & TRACE_ITER_SYM_ADDR)
432                 trace_seq_printf(s, " <" IP_FMT ">", ip);
433
434  out:
435         return !trace_seq_has_overflowed(s);
436 }
437
438 /**
439  * trace_print_lat_fmt - print the irq, preempt and lockdep fields
440  * @s: trace seq struct to write to
441  * @entry: The trace entry field from the ring buffer
442  *
443  * Prints the generic fields of irqs off, in hard or softirq, preempt
444  * count.
445  */
446 int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry)
447 {
448         char hardsoft_irq;
449         char need_resched;
450         char irqs_off;
451         int hardirq;
452         int softirq;
453         int nmi;
454
455         nmi = entry->flags & TRACE_FLAG_NMI;
456         hardirq = entry->flags & TRACE_FLAG_HARDIRQ;
457         softirq = entry->flags & TRACE_FLAG_SOFTIRQ;
458
459         irqs_off =
460                 (entry->flags & TRACE_FLAG_IRQS_OFF) ? 'd' :
461                 (entry->flags & TRACE_FLAG_IRQS_NOSUPPORT) ? 'X' :
462                 '.';
463
464         switch (entry->flags & (TRACE_FLAG_NEED_RESCHED |
465                                 TRACE_FLAG_PREEMPT_RESCHED)) {
466         case TRACE_FLAG_NEED_RESCHED | TRACE_FLAG_PREEMPT_RESCHED:
467                 need_resched = 'N';
468                 break;
469         case TRACE_FLAG_NEED_RESCHED:
470                 need_resched = 'n';
471                 break;
472         case TRACE_FLAG_PREEMPT_RESCHED:
473                 need_resched = 'p';
474                 break;
475         default:
476                 need_resched = '.';
477                 break;
478         }
479
480         hardsoft_irq =
481                 (nmi && hardirq)     ? 'Z' :
482                 nmi                  ? 'z' :
483                 (hardirq && softirq) ? 'H' :
484                 hardirq              ? 'h' :
485                 softirq              ? 's' :
486                                        '.' ;
487
488         trace_seq_printf(s, "%c%c%c",
489                          irqs_off, need_resched, hardsoft_irq);
490
491         if (entry->preempt_count)
492                 trace_seq_printf(s, "%x", entry->preempt_count);
493         else
494                 trace_seq_putc(s, '.');
495
496         return !trace_seq_has_overflowed(s);
497 }
498
499 static int
500 lat_print_generic(struct trace_seq *s, struct trace_entry *entry, int cpu)
501 {
502         char comm[TASK_COMM_LEN];
503
504         trace_find_cmdline(entry->pid, comm);
505
506         trace_seq_printf(s, "%8.8s-%-5d %3d",
507                          comm, entry->pid, cpu);
508
509         return trace_print_lat_fmt(s, entry);
510 }
511
512 #undef MARK
513 #define MARK(v, s) {.val = v, .sym = s}
514 /* trace overhead mark */
515 static const struct trace_mark {
516         unsigned long long      val; /* unit: nsec */
517         char                    sym;
518 } mark[] = {
519         MARK(1000000000ULL      , '$'), /* 1 sec */
520         MARK(100000000ULL       , '@'), /* 100 msec */
521         MARK(10000000ULL        , '*'), /* 10 msec */
522         MARK(1000000ULL         , '#'), /* 1000 usecs */
523         MARK(100000ULL          , '!'), /* 100 usecs */
524         MARK(10000ULL           , '+'), /* 10 usecs */
525 };
526 #undef MARK
527
528 char trace_find_mark(unsigned long long d)
529 {
530         int i;
531         int size = ARRAY_SIZE(mark);
532
533         for (i = 0; i < size; i++) {
534                 if (d > mark[i].val)
535                         break;
536         }
537
538         return (i == size) ? ' ' : mark[i].sym;
539 }
540
541 static int
542 lat_print_timestamp(struct trace_iterator *iter, u64 next_ts)
543 {
544         struct trace_array *tr = iter->tr;
545         unsigned long verbose = tr->trace_flags & TRACE_ITER_VERBOSE;
546         unsigned long in_ns = iter->iter_flags & TRACE_FILE_TIME_IN_NS;
547         unsigned long long abs_ts = iter->ts - iter->trace_buffer->time_start;
548         unsigned long long rel_ts = next_ts - iter->ts;
549         struct trace_seq *s = &iter->seq;
550
551         if (in_ns) {
552                 abs_ts = ns2usecs(abs_ts);
553                 rel_ts = ns2usecs(rel_ts);
554         }
555
556         if (verbose && in_ns) {
557                 unsigned long abs_usec = do_div(abs_ts, USEC_PER_MSEC);
558                 unsigned long abs_msec = (unsigned long)abs_ts;
559                 unsigned long rel_usec = do_div(rel_ts, USEC_PER_MSEC);
560                 unsigned long rel_msec = (unsigned long)rel_ts;
561
562                 trace_seq_printf(
563                         s, "[%08llx] %ld.%03ldms (+%ld.%03ldms): ",
564                         ns2usecs(iter->ts),
565                         abs_msec, abs_usec,
566                         rel_msec, rel_usec);
567
568         } else if (verbose && !in_ns) {
569                 trace_seq_printf(
570                         s, "[%016llx] %lld (+%lld): ",
571                         iter->ts, abs_ts, rel_ts);
572
573         } else if (!verbose && in_ns) {
574                 trace_seq_printf(
575                         s, " %4lldus%c: ",
576                         abs_ts,
577                         trace_find_mark(rel_ts * NSEC_PER_USEC));
578
579         } else { /* !verbose && !in_ns */
580                 trace_seq_printf(s, " %4lld: ", abs_ts);
581         }
582
583         return !trace_seq_has_overflowed(s);
584 }
585
586 int trace_print_context(struct trace_iterator *iter)
587 {
588         struct trace_array *tr = iter->tr;
589         struct trace_seq *s = &iter->seq;
590         struct trace_entry *entry = iter->ent;
591         unsigned long long t;
592         unsigned long secs, usec_rem;
593         char comm[TASK_COMM_LEN];
594
595         trace_find_cmdline(entry->pid, comm);
596
597         trace_seq_printf(s, "%16s-%-5d ", comm, entry->pid);
598
599         if (tr->trace_flags & TRACE_ITER_RECORD_TGID) {
600                 unsigned int tgid = trace_find_tgid(entry->pid);
601
602                 if (!tgid)
603                         trace_seq_printf(s, "(-----) ");
604                 else
605                         trace_seq_printf(s, "(%5d) ", tgid);
606         }
607
608         trace_seq_printf(s, "[%03d] ", iter->cpu);
609
610         if (tr->trace_flags & TRACE_ITER_IRQ_INFO)
611                 trace_print_lat_fmt(s, entry);
612
613         if (iter->iter_flags & TRACE_FILE_TIME_IN_NS) {
614                 t = ns2usecs(iter->ts);
615                 usec_rem = do_div(t, USEC_PER_SEC);
616                 secs = (unsigned long)t;
617                 trace_seq_printf(s, " %5lu.%06lu: ", secs, usec_rem);
618         } else
619                 trace_seq_printf(s, " %12llu: ", iter->ts);
620
621         return !trace_seq_has_overflowed(s);
622 }
623
624 int trace_print_lat_context(struct trace_iterator *iter)
625 {
626         struct trace_array *tr = iter->tr;
627         /* trace_find_next_entry will reset ent_size */
628         int ent_size = iter->ent_size;
629         struct trace_seq *s = &iter->seq;
630         u64 next_ts;
631         struct trace_entry *entry = iter->ent,
632                            *next_entry = trace_find_next_entry(iter, NULL,
633                                                                &next_ts);
634         unsigned long verbose = (tr->trace_flags & TRACE_ITER_VERBOSE);
635
636         /* Restore the original ent_size */
637         iter->ent_size = ent_size;
638
639         if (!next_entry)
640                 next_ts = iter->ts;
641
642         if (verbose) {
643                 char comm[TASK_COMM_LEN];
644
645                 trace_find_cmdline(entry->pid, comm);
646
647                 trace_seq_printf(
648                         s, "%16s %5d %3d %d %08x %08lx ",
649                         comm, entry->pid, iter->cpu, entry->flags,
650                         entry->preempt_count, iter->idx);
651         } else {
652                 lat_print_generic(s, entry, iter->cpu);
653         }
654
655         lat_print_timestamp(iter, next_ts);
656
657         return !trace_seq_has_overflowed(s);
658 }
659
660 /**
661  * ftrace_find_event - find a registered event
662  * @type: the type of event to look for
663  *
664  * Returns an event of type @type otherwise NULL
665  * Called with trace_event_read_lock() held.
666  */
667 struct trace_event *ftrace_find_event(int type)
668 {
669         struct trace_event *event;
670         unsigned key;
671
672         key = type & (EVENT_HASHSIZE - 1);
673
674         hlist_for_each_entry(event, &event_hash[key], node) {
675                 if (event->type == type)
676                         return event;
677         }
678
679         return NULL;
680 }
681
682 static LIST_HEAD(ftrace_event_list);
683
684 static int trace_search_list(struct list_head **list)
685 {
686         struct trace_event *e;
687         int last = __TRACE_LAST_TYPE;
688
689         if (list_empty(&ftrace_event_list)) {
690                 *list = &ftrace_event_list;
691                 return last + 1;
692         }
693
694         /*
695          * We used up all possible max events,
696          * lets see if somebody freed one.
697          */
698         list_for_each_entry(e, &ftrace_event_list, list) {
699                 if (e->type != last + 1)
700                         break;
701                 last++;
702         }
703
704         /* Did we used up all 65 thousand events??? */
705         if ((last + 1) > TRACE_EVENT_TYPE_MAX)
706                 return 0;
707
708         *list = &e->list;
709         return last + 1;
710 }
711
712 void trace_event_read_lock(void)
713 {
714         down_read(&trace_event_sem);
715 }
716
717 void trace_event_read_unlock(void)
718 {
719         up_read(&trace_event_sem);
720 }
721
722 /**
723  * register_trace_event - register output for an event type
724  * @event: the event type to register
725  *
726  * Event types are stored in a hash and this hash is used to
727  * find a way to print an event. If the @event->type is set
728  * then it will use that type, otherwise it will assign a
729  * type to use.
730  *
731  * If you assign your own type, please make sure it is added
732  * to the trace_type enum in trace.h, to avoid collisions
733  * with the dynamic types.
734  *
735  * Returns the event type number or zero on error.
736  */
737 int register_trace_event(struct trace_event *event)
738 {
739         unsigned key;
740         int ret = 0;
741
742         down_write(&trace_event_sem);
743
744         if (WARN_ON(!event))
745                 goto out;
746
747         if (WARN_ON(!event->funcs))
748                 goto out;
749
750         INIT_LIST_HEAD(&event->list);
751
752         if (!event->type) {
753                 struct list_head *list = NULL;
754
755                 if (next_event_type > TRACE_EVENT_TYPE_MAX) {
756
757                         event->type = trace_search_list(&list);
758                         if (!event->type)
759                                 goto out;
760
761                 } else {
762
763                         event->type = next_event_type++;
764                         list = &ftrace_event_list;
765                 }
766
767                 if (WARN_ON(ftrace_find_event(event->type)))
768                         goto out;
769
770                 list_add_tail(&event->list, list);
771
772         } else if (event->type > __TRACE_LAST_TYPE) {
773                 printk(KERN_WARNING "Need to add type to trace.h\n");
774                 WARN_ON(1);
775                 goto out;
776         } else {
777                 /* Is this event already used */
778                 if (ftrace_find_event(event->type))
779                         goto out;
780         }
781
782         if (event->funcs->trace == NULL)
783                 event->funcs->trace = trace_nop_print;
784         if (event->funcs->raw == NULL)
785                 event->funcs->raw = trace_nop_print;
786         if (event->funcs->hex == NULL)
787                 event->funcs->hex = trace_nop_print;
788         if (event->funcs->binary == NULL)
789                 event->funcs->binary = trace_nop_print;
790
791         key = event->type & (EVENT_HASHSIZE - 1);
792
793         hlist_add_head(&event->node, &event_hash[key]);
794
795         ret = event->type;
796  out:
797         up_write(&trace_event_sem);
798
799         return ret;
800 }
801 EXPORT_SYMBOL_GPL(register_trace_event);
802
803 /*
804  * Used by module code with the trace_event_sem held for write.
805  */
806 int __unregister_trace_event(struct trace_event *event)
807 {
808         hlist_del(&event->node);
809         list_del(&event->list);
810         return 0;
811 }
812
813 /**
814  * unregister_trace_event - remove a no longer used event
815  * @event: the event to remove
816  */
817 int unregister_trace_event(struct trace_event *event)
818 {
819         down_write(&trace_event_sem);
820         __unregister_trace_event(event);
821         up_write(&trace_event_sem);
822
823         return 0;
824 }
825 EXPORT_SYMBOL_GPL(unregister_trace_event);
826
827 /*
828  * Standard events
829  */
830
831 enum print_line_t trace_nop_print(struct trace_iterator *iter, int flags,
832                                   struct trace_event *event)
833 {
834         trace_seq_printf(&iter->seq, "type: %d\n", iter->ent->type);
835
836         return trace_handle_return(&iter->seq);
837 }
838
839 /* TRACE_FN */
840 static enum print_line_t trace_fn_trace(struct trace_iterator *iter, int flags,
841                                         struct trace_event *event)
842 {
843         struct ftrace_entry *field;
844         struct trace_seq *s = &iter->seq;
845
846         trace_assign_type(field, iter->ent);
847
848         seq_print_ip_sym(s, field->ip, flags);
849
850         if ((flags & TRACE_ITER_PRINT_PARENT) && field->parent_ip) {
851                 trace_seq_puts(s, " <-");
852                 seq_print_ip_sym(s, field->parent_ip, flags);
853         }
854
855         trace_seq_putc(s, '\n');
856
857         return trace_handle_return(s);
858 }
859
860 static enum print_line_t trace_fn_raw(struct trace_iterator *iter, int flags,
861                                       struct trace_event *event)
862 {
863         struct ftrace_entry *field;
864
865         trace_assign_type(field, iter->ent);
866
867         trace_seq_printf(&iter->seq, "%lx %lx\n",
868                          field->ip,
869                          field->parent_ip);
870
871         return trace_handle_return(&iter->seq);
872 }
873
874 static enum print_line_t trace_fn_hex(struct trace_iterator *iter, int flags,
875                                       struct trace_event *event)
876 {
877         struct ftrace_entry *field;
878         struct trace_seq *s = &iter->seq;
879
880         trace_assign_type(field, iter->ent);
881
882         SEQ_PUT_HEX_FIELD(s, field->ip);
883         SEQ_PUT_HEX_FIELD(s, field->parent_ip);
884
885         return trace_handle_return(s);
886 }
887
888 static enum print_line_t trace_fn_bin(struct trace_iterator *iter, int flags,
889                                       struct trace_event *event)
890 {
891         struct ftrace_entry *field;
892         struct trace_seq *s = &iter->seq;
893
894         trace_assign_type(field, iter->ent);
895
896         SEQ_PUT_FIELD(s, field->ip);
897         SEQ_PUT_FIELD(s, field->parent_ip);
898
899         return trace_handle_return(s);
900 }
901
902 static struct trace_event_functions trace_fn_funcs = {
903         .trace          = trace_fn_trace,
904         .raw            = trace_fn_raw,
905         .hex            = trace_fn_hex,
906         .binary         = trace_fn_bin,
907 };
908
909 static struct trace_event trace_fn_event = {
910         .type           = TRACE_FN,
911         .funcs          = &trace_fn_funcs,
912 };
913
914 /* TRACE_CTX an TRACE_WAKE */
915 static enum print_line_t trace_ctxwake_print(struct trace_iterator *iter,
916                                              char *delim)
917 {
918         struct ctx_switch_entry *field;
919         char comm[TASK_COMM_LEN];
920         int S, T;
921
922
923         trace_assign_type(field, iter->ent);
924
925         T = task_index_to_char(field->next_state);
926         S = task_index_to_char(field->prev_state);
927         trace_find_cmdline(field->next_pid, comm);
928         trace_seq_printf(&iter->seq,
929                          " %5d:%3d:%c %s [%03d] %5d:%3d:%c %s\n",
930                          field->prev_pid,
931                          field->prev_prio,
932                          S, delim,
933                          field->next_cpu,
934                          field->next_pid,
935                          field->next_prio,
936                          T, comm);
937
938         return trace_handle_return(&iter->seq);
939 }
940
941 static enum print_line_t trace_ctx_print(struct trace_iterator *iter, int flags,
942                                          struct trace_event *event)
943 {
944         return trace_ctxwake_print(iter, "==>");
945 }
946
947 static enum print_line_t trace_wake_print(struct trace_iterator *iter,
948                                           int flags, struct trace_event *event)
949 {
950         return trace_ctxwake_print(iter, "  +");
951 }
952
953 static int trace_ctxwake_raw(struct trace_iterator *iter, char S)
954 {
955         struct ctx_switch_entry *field;
956         int T;
957
958         trace_assign_type(field, iter->ent);
959
960         if (!S)
961                 S = task_index_to_char(field->prev_state);
962         T = task_index_to_char(field->next_state);
963         trace_seq_printf(&iter->seq, "%d %d %c %d %d %d %c\n",
964                          field->prev_pid,
965                          field->prev_prio,
966                          S,
967                          field->next_cpu,
968                          field->next_pid,
969                          field->next_prio,
970                          T);
971
972         return trace_handle_return(&iter->seq);
973 }
974
975 static enum print_line_t trace_ctx_raw(struct trace_iterator *iter, int flags,
976                                        struct trace_event *event)
977 {
978         return trace_ctxwake_raw(iter, 0);
979 }
980
981 static enum print_line_t trace_wake_raw(struct trace_iterator *iter, int flags,
982                                         struct trace_event *event)
983 {
984         return trace_ctxwake_raw(iter, '+');
985 }
986
987
988 static int trace_ctxwake_hex(struct trace_iterator *iter, char S)
989 {
990         struct ctx_switch_entry *field;
991         struct trace_seq *s = &iter->seq;
992         int T;
993
994         trace_assign_type(field, iter->ent);
995
996         if (!S)
997                 S = task_index_to_char(field->prev_state);
998         T = task_index_to_char(field->next_state);
999
1000         SEQ_PUT_HEX_FIELD(s, field->prev_pid);
1001         SEQ_PUT_HEX_FIELD(s, field->prev_prio);
1002         SEQ_PUT_HEX_FIELD(s, S);
1003         SEQ_PUT_HEX_FIELD(s, field->next_cpu);
1004         SEQ_PUT_HEX_FIELD(s, field->next_pid);
1005         SEQ_PUT_HEX_FIELD(s, field->next_prio);
1006         SEQ_PUT_HEX_FIELD(s, T);
1007
1008         return trace_handle_return(s);
1009 }
1010
1011 static enum print_line_t trace_ctx_hex(struct trace_iterator *iter, int flags,
1012                                        struct trace_event *event)
1013 {
1014         return trace_ctxwake_hex(iter, 0);
1015 }
1016
1017 static enum print_line_t trace_wake_hex(struct trace_iterator *iter, int flags,
1018                                         struct trace_event *event)
1019 {
1020         return trace_ctxwake_hex(iter, '+');
1021 }
1022
1023 static enum print_line_t trace_ctxwake_bin(struct trace_iterator *iter,
1024                                            int flags, struct trace_event *event)
1025 {
1026         struct ctx_switch_entry *field;
1027         struct trace_seq *s = &iter->seq;
1028
1029         trace_assign_type(field, iter->ent);
1030
1031         SEQ_PUT_FIELD(s, field->prev_pid);
1032         SEQ_PUT_FIELD(s, field->prev_prio);
1033         SEQ_PUT_FIELD(s, field->prev_state);
1034         SEQ_PUT_FIELD(s, field->next_cpu);
1035         SEQ_PUT_FIELD(s, field->next_pid);
1036         SEQ_PUT_FIELD(s, field->next_prio);
1037         SEQ_PUT_FIELD(s, field->next_state);
1038
1039         return trace_handle_return(s);
1040 }
1041
1042 static struct trace_event_functions trace_ctx_funcs = {
1043         .trace          = trace_ctx_print,
1044         .raw            = trace_ctx_raw,
1045         .hex            = trace_ctx_hex,
1046         .binary         = trace_ctxwake_bin,
1047 };
1048
1049 static struct trace_event trace_ctx_event = {
1050         .type           = TRACE_CTX,
1051         .funcs          = &trace_ctx_funcs,
1052 };
1053
1054 static struct trace_event_functions trace_wake_funcs = {
1055         .trace          = trace_wake_print,
1056         .raw            = trace_wake_raw,
1057         .hex            = trace_wake_hex,
1058         .binary         = trace_ctxwake_bin,
1059 };
1060
1061 static struct trace_event trace_wake_event = {
1062         .type           = TRACE_WAKE,
1063         .funcs          = &trace_wake_funcs,
1064 };
1065
1066 /* TRACE_STACK */
1067
1068 static enum print_line_t trace_stack_print(struct trace_iterator *iter,
1069                                            int flags, struct trace_event *event)
1070 {
1071         struct stack_entry *field;
1072         struct trace_seq *s = &iter->seq;
1073         unsigned long *p;
1074         unsigned long *end;
1075
1076         trace_assign_type(field, iter->ent);
1077         end = (unsigned long *)((long)iter->ent + iter->ent_size);
1078
1079         trace_seq_puts(s, "<stack trace>\n");
1080
1081         for (p = field->caller; p && *p != ULONG_MAX && p < end; p++) {
1082
1083                 if (trace_seq_has_overflowed(s))
1084                         break;
1085
1086                 trace_seq_puts(s, " => ");
1087                 seq_print_ip_sym(s, *p, flags);
1088                 trace_seq_putc(s, '\n');
1089         }
1090
1091         return trace_handle_return(s);
1092 }
1093
1094 static struct trace_event_functions trace_stack_funcs = {
1095         .trace          = trace_stack_print,
1096 };
1097
1098 static struct trace_event trace_stack_event = {
1099         .type           = TRACE_STACK,
1100         .funcs          = &trace_stack_funcs,
1101 };
1102
1103 /* TRACE_USER_STACK */
1104 static enum print_line_t trace_user_stack_print(struct trace_iterator *iter,
1105                                                 int flags, struct trace_event *event)
1106 {
1107         struct trace_array *tr = iter->tr;
1108         struct userstack_entry *field;
1109         struct trace_seq *s = &iter->seq;
1110         struct mm_struct *mm = NULL;
1111         unsigned int i;
1112
1113         trace_assign_type(field, iter->ent);
1114
1115         trace_seq_puts(s, "<user stack trace>\n");
1116
1117         if (tr->trace_flags & TRACE_ITER_SYM_USEROBJ) {
1118                 struct task_struct *task;
1119                 /*
1120                  * we do the lookup on the thread group leader,
1121                  * since individual threads might have already quit!
1122                  */
1123                 rcu_read_lock();
1124                 task = find_task_by_vpid(field->tgid);
1125                 if (task)
1126                         mm = get_task_mm(task);
1127                 rcu_read_unlock();
1128         }
1129
1130         for (i = 0; i < FTRACE_STACK_ENTRIES; i++) {
1131                 unsigned long ip = field->caller[i];
1132
1133                 if (ip == ULONG_MAX || trace_seq_has_overflowed(s))
1134                         break;
1135
1136                 trace_seq_puts(s, " => ");
1137
1138                 if (!ip) {
1139                         trace_seq_puts(s, "??");
1140                         trace_seq_putc(s, '\n');
1141                         continue;
1142                 }
1143
1144                 seq_print_user_ip(s, mm, ip, flags);
1145                 trace_seq_putc(s, '\n');
1146         }
1147
1148         if (mm)
1149                 mmput(mm);
1150
1151         return trace_handle_return(s);
1152 }
1153
1154 static struct trace_event_functions trace_user_stack_funcs = {
1155         .trace          = trace_user_stack_print,
1156 };
1157
1158 static struct trace_event trace_user_stack_event = {
1159         .type           = TRACE_USER_STACK,
1160         .funcs          = &trace_user_stack_funcs,
1161 };
1162
1163 /* TRACE_HWLAT */
1164 static enum print_line_t
1165 trace_hwlat_print(struct trace_iterator *iter, int flags,
1166                   struct trace_event *event)
1167 {
1168         struct trace_entry *entry = iter->ent;
1169         struct trace_seq *s = &iter->seq;
1170         struct hwlat_entry *field;
1171
1172         trace_assign_type(field, entry);
1173
1174         trace_seq_printf(s, "#%-5u inner/outer(us): %4llu/%-5llu ts:%lld.%09ld",
1175                          field->seqnum,
1176                          field->duration,
1177                          field->outer_duration,
1178                          (long long)field->timestamp.tv_sec,
1179                          field->timestamp.tv_nsec);
1180
1181         if (field->nmi_count) {
1182                 /*
1183                  * The generic sched_clock() is not NMI safe, thus
1184                  * we only record the count and not the time.
1185                  */
1186                 if (!IS_ENABLED(CONFIG_GENERIC_SCHED_CLOCK))
1187                         trace_seq_printf(s, " nmi-total:%llu",
1188                                          field->nmi_total_ts);
1189                 trace_seq_printf(s, " nmi-count:%u",
1190                                  field->nmi_count);
1191         }
1192
1193         trace_seq_putc(s, '\n');
1194
1195         return trace_handle_return(s);
1196 }
1197
1198
1199 static enum print_line_t
1200 trace_hwlat_raw(struct trace_iterator *iter, int flags,
1201                 struct trace_event *event)
1202 {
1203         struct hwlat_entry *field;
1204         struct trace_seq *s = &iter->seq;
1205
1206         trace_assign_type(field, iter->ent);
1207
1208         trace_seq_printf(s, "%llu %lld %lld %09ld %u\n",
1209                          field->duration,
1210                          field->outer_duration,
1211                          (long long)field->timestamp.tv_sec,
1212                          field->timestamp.tv_nsec,
1213                          field->seqnum);
1214
1215         return trace_handle_return(s);
1216 }
1217
1218 static struct trace_event_functions trace_hwlat_funcs = {
1219         .trace          = trace_hwlat_print,
1220         .raw            = trace_hwlat_raw,
1221 };
1222
1223 static struct trace_event trace_hwlat_event = {
1224         .type           = TRACE_HWLAT,
1225         .funcs          = &trace_hwlat_funcs,
1226 };
1227
1228 /* TRACE_BPUTS */
1229 static enum print_line_t
1230 trace_bputs_print(struct trace_iterator *iter, int flags,
1231                    struct trace_event *event)
1232 {
1233         struct trace_entry *entry = iter->ent;
1234         struct trace_seq *s = &iter->seq;
1235         struct bputs_entry *field;
1236
1237         trace_assign_type(field, entry);
1238
1239         seq_print_ip_sym(s, field->ip, flags);
1240         trace_seq_puts(s, ": ");
1241         trace_seq_puts(s, field->str);
1242
1243         return trace_handle_return(s);
1244 }
1245
1246
1247 static enum print_line_t
1248 trace_bputs_raw(struct trace_iterator *iter, int flags,
1249                 struct trace_event *event)
1250 {
1251         struct bputs_entry *field;
1252         struct trace_seq *s = &iter->seq;
1253
1254         trace_assign_type(field, iter->ent);
1255
1256         trace_seq_printf(s, ": %lx : ", field->ip);
1257         trace_seq_puts(s, field->str);
1258
1259         return trace_handle_return(s);
1260 }
1261
1262 static struct trace_event_functions trace_bputs_funcs = {
1263         .trace          = trace_bputs_print,
1264         .raw            = trace_bputs_raw,
1265 };
1266
1267 static struct trace_event trace_bputs_event = {
1268         .type           = TRACE_BPUTS,
1269         .funcs          = &trace_bputs_funcs,
1270 };
1271
1272 /* TRACE_BPRINT */
1273 static enum print_line_t
1274 trace_bprint_print(struct trace_iterator *iter, int flags,
1275                    struct trace_event *event)
1276 {
1277         struct trace_entry *entry = iter->ent;
1278         struct trace_seq *s = &iter->seq;
1279         struct bprint_entry *field;
1280
1281         trace_assign_type(field, entry);
1282
1283         seq_print_ip_sym(s, field->ip, flags);
1284         trace_seq_puts(s, ": ");
1285         trace_seq_bprintf(s, field->fmt, field->buf);
1286
1287         return trace_handle_return(s);
1288 }
1289
1290
1291 static enum print_line_t
1292 trace_bprint_raw(struct trace_iterator *iter, int flags,
1293                  struct trace_event *event)
1294 {
1295         struct bprint_entry *field;
1296         struct trace_seq *s = &iter->seq;
1297
1298         trace_assign_type(field, iter->ent);
1299
1300         trace_seq_printf(s, ": %lx : ", field->ip);
1301         trace_seq_bprintf(s, field->fmt, field->buf);
1302
1303         return trace_handle_return(s);
1304 }
1305
1306 static struct trace_event_functions trace_bprint_funcs = {
1307         .trace          = trace_bprint_print,
1308         .raw            = trace_bprint_raw,
1309 };
1310
1311 static struct trace_event trace_bprint_event = {
1312         .type           = TRACE_BPRINT,
1313         .funcs          = &trace_bprint_funcs,
1314 };
1315
1316 /* TRACE_PRINT */
1317 static enum print_line_t trace_print_print(struct trace_iterator *iter,
1318                                            int flags, struct trace_event *event)
1319 {
1320         struct print_entry *field;
1321         struct trace_seq *s = &iter->seq;
1322
1323         trace_assign_type(field, iter->ent);
1324
1325         seq_print_ip_sym(s, field->ip, flags);
1326         trace_seq_printf(s, ": %s", field->buf);
1327
1328         return trace_handle_return(s);
1329 }
1330
1331 static enum print_line_t trace_print_raw(struct trace_iterator *iter, int flags,
1332                                          struct trace_event *event)
1333 {
1334         struct print_entry *field;
1335
1336         trace_assign_type(field, iter->ent);
1337
1338         trace_seq_printf(&iter->seq, "# %lx %s", field->ip, field->buf);
1339
1340         return trace_handle_return(&iter->seq);
1341 }
1342
1343 static struct trace_event_functions trace_print_funcs = {
1344         .trace          = trace_print_print,
1345         .raw            = trace_print_raw,
1346 };
1347
1348 static struct trace_event trace_print_event = {
1349         .type           = TRACE_PRINT,
1350         .funcs          = &trace_print_funcs,
1351 };
1352
1353 static enum print_line_t trace_raw_data(struct trace_iterator *iter, int flags,
1354                                          struct trace_event *event)
1355 {
1356         struct raw_data_entry *field;
1357         int i;
1358
1359         trace_assign_type(field, iter->ent);
1360
1361         trace_seq_printf(&iter->seq, "# %x buf:", field->id);
1362
1363         for (i = 0; i < iter->ent_size - offsetof(struct raw_data_entry, buf); i++)
1364                 trace_seq_printf(&iter->seq, " %02x",
1365                                  (unsigned char)field->buf[i]);
1366
1367         trace_seq_putc(&iter->seq, '\n');
1368
1369         return trace_handle_return(&iter->seq);
1370 }
1371
1372 static struct trace_event_functions trace_raw_data_funcs = {
1373         .trace          = trace_raw_data,
1374         .raw            = trace_raw_data,
1375 };
1376
1377 static struct trace_event trace_raw_data_event = {
1378         .type           = TRACE_RAW_DATA,
1379         .funcs          = &trace_raw_data_funcs,
1380 };
1381
1382
1383 static struct trace_event *events[] __initdata = {
1384         &trace_fn_event,
1385         &trace_ctx_event,
1386         &trace_wake_event,
1387         &trace_stack_event,
1388         &trace_user_stack_event,
1389         &trace_bputs_event,
1390         &trace_bprint_event,
1391         &trace_print_event,
1392         &trace_hwlat_event,
1393         &trace_raw_data_event,
1394         NULL
1395 };
1396
1397 __init static int init_events(void)
1398 {
1399         struct trace_event *event;
1400         int i, ret;
1401
1402         for (i = 0; events[i]; i++) {
1403                 event = events[i];
1404
1405                 ret = register_trace_event(event);
1406                 if (!ret) {
1407                         printk(KERN_WARNING "event %d failed to register\n",
1408                                event->type);
1409                         WARN_ON_ONCE(1);
1410                 }
1411         }
1412
1413         return 0;
1414 }
1415 early_initcall(init_events);