aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace_output.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/trace/trace_output.c')
-rw-r--r--kernel/trace/trace_output.c198
1 files changed, 96 insertions, 102 deletions
diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c
index 8e46b3323cdc..02272baa2206 100644
--- a/kernel/trace/trace_output.c
+++ b/kernel/trace/trace_output.c
@@ -16,9 +16,6 @@
16 16
17DECLARE_RWSEM(trace_event_mutex); 17DECLARE_RWSEM(trace_event_mutex);
18 18
19DEFINE_PER_CPU(struct trace_seq, ftrace_event_seq);
20EXPORT_PER_CPU_SYMBOL(ftrace_event_seq);
21
22static struct hlist_head event_hash[EVENT_HASHSIZE] __read_mostly; 19static struct hlist_head event_hash[EVENT_HASHSIZE] __read_mostly;
23 20
24static int next_event_type = __TRACE_LAST_TYPE + 1; 21static int next_event_type = __TRACE_LAST_TYPE + 1;
@@ -209,6 +206,7 @@ int trace_seq_putc(struct trace_seq *s, unsigned char c)
209 206
210 return 1; 207 return 1;
211} 208}
209EXPORT_SYMBOL(trace_seq_putc);
212 210
213int trace_seq_putmem(struct trace_seq *s, const void *mem, size_t len) 211int trace_seq_putmem(struct trace_seq *s, const void *mem, size_t len)
214{ 212{
@@ -253,7 +251,7 @@ void *trace_seq_reserve(struct trace_seq *s, size_t len)
253 void *ret; 251 void *ret;
254 252
255 if (s->full) 253 if (s->full)
256 return 0; 254 return NULL;
257 255
258 if (len > ((PAGE_SIZE - 1) - s->len)) { 256 if (len > ((PAGE_SIZE - 1) - s->len)) {
259 s->full = 1; 257 s->full = 1;
@@ -355,6 +353,21 @@ ftrace_print_symbols_seq(struct trace_seq *p, unsigned long val,
355} 353}
356EXPORT_SYMBOL(ftrace_print_symbols_seq); 354EXPORT_SYMBOL(ftrace_print_symbols_seq);
357 355
356const char *
357ftrace_print_hex_seq(struct trace_seq *p, const unsigned char *buf, int buf_len)
358{
359 int i;
360 const char *ret = p->buffer + p->len;
361
362 for (i = 0; i < buf_len; i++)
363 trace_seq_printf(p, "%s%2.2x", i == 0 ? "" : " ", buf[i]);
364
365 trace_seq_putc(p, 0);
366
367 return ret;
368}
369EXPORT_SYMBOL(ftrace_print_hex_seq);
370
358#ifdef CONFIG_KRETPROBES 371#ifdef CONFIG_KRETPROBES
359static inline const char *kretprobed(const char *name) 372static inline const char *kretprobed(const char *name)
360{ 373{
@@ -726,6 +739,9 @@ int register_ftrace_event(struct trace_event *event)
726 if (WARN_ON(!event)) 739 if (WARN_ON(!event))
727 goto out; 740 goto out;
728 741
742 if (WARN_ON(!event->funcs))
743 goto out;
744
729 INIT_LIST_HEAD(&event->list); 745 INIT_LIST_HEAD(&event->list);
730 746
731 if (!event->type) { 747 if (!event->type) {
@@ -758,14 +774,14 @@ int register_ftrace_event(struct trace_event *event)
758 goto out; 774 goto out;
759 } 775 }
760 776
761 if (event->trace == NULL) 777 if (event->funcs->trace == NULL)
762 event->trace = trace_nop_print; 778 event->funcs->trace = trace_nop_print;
763 if (event->raw == NULL) 779 if (event->funcs->raw == NULL)
764 event->raw = trace_nop_print; 780 event->funcs->raw = trace_nop_print;
765 if (event->hex == NULL) 781 if (event->funcs->hex == NULL)
766 event->hex = trace_nop_print; 782 event->funcs->hex = trace_nop_print;
767 if (event->binary == NULL) 783 if (event->funcs->binary == NULL)
768 event->binary = trace_nop_print; 784 event->funcs->binary = trace_nop_print;
769 785
770 key = event->type & (EVENT_HASHSIZE - 1); 786 key = event->type & (EVENT_HASHSIZE - 1);
771 787
@@ -807,13 +823,15 @@ EXPORT_SYMBOL_GPL(unregister_ftrace_event);
807 * Standard events 823 * Standard events
808 */ 824 */
809 825
810enum print_line_t trace_nop_print(struct trace_iterator *iter, int flags) 826enum print_line_t trace_nop_print(struct trace_iterator *iter, int flags,
827 struct trace_event *event)
811{ 828{
812 return TRACE_TYPE_HANDLED; 829 return TRACE_TYPE_HANDLED;
813} 830}
814 831
815/* TRACE_FN */ 832/* TRACE_FN */
816static enum print_line_t trace_fn_trace(struct trace_iterator *iter, int flags) 833static enum print_line_t trace_fn_trace(struct trace_iterator *iter, int flags,
834 struct trace_event *event)
817{ 835{
818 struct ftrace_entry *field; 836 struct ftrace_entry *field;
819 struct trace_seq *s = &iter->seq; 837 struct trace_seq *s = &iter->seq;
@@ -840,7 +858,8 @@ static enum print_line_t trace_fn_trace(struct trace_iterator *iter, int flags)
840 return TRACE_TYPE_PARTIAL_LINE; 858 return TRACE_TYPE_PARTIAL_LINE;
841} 859}
842 860
843static enum print_line_t trace_fn_raw(struct trace_iterator *iter, int flags) 861static enum print_line_t trace_fn_raw(struct trace_iterator *iter, int flags,
862 struct trace_event *event)
844{ 863{
845 struct ftrace_entry *field; 864 struct ftrace_entry *field;
846 865
@@ -854,7 +873,8 @@ static enum print_line_t trace_fn_raw(struct trace_iterator *iter, int flags)
854 return TRACE_TYPE_HANDLED; 873 return TRACE_TYPE_HANDLED;
855} 874}
856 875
857static enum print_line_t trace_fn_hex(struct trace_iterator *iter, int flags) 876static enum print_line_t trace_fn_hex(struct trace_iterator *iter, int flags,
877 struct trace_event *event)
858{ 878{
859 struct ftrace_entry *field; 879 struct ftrace_entry *field;
860 struct trace_seq *s = &iter->seq; 880 struct trace_seq *s = &iter->seq;
@@ -867,7 +887,8 @@ static enum print_line_t trace_fn_hex(struct trace_iterator *iter, int flags)
867 return TRACE_TYPE_HANDLED; 887 return TRACE_TYPE_HANDLED;
868} 888}
869 889
870static enum print_line_t trace_fn_bin(struct trace_iterator *iter, int flags) 890static enum print_line_t trace_fn_bin(struct trace_iterator *iter, int flags,
891 struct trace_event *event)
871{ 892{
872 struct ftrace_entry *field; 893 struct ftrace_entry *field;
873 struct trace_seq *s = &iter->seq; 894 struct trace_seq *s = &iter->seq;
@@ -880,14 +901,18 @@ static enum print_line_t trace_fn_bin(struct trace_iterator *iter, int flags)
880 return TRACE_TYPE_HANDLED; 901 return TRACE_TYPE_HANDLED;
881} 902}
882 903
883static struct trace_event trace_fn_event = { 904static struct trace_event_functions trace_fn_funcs = {
884 .type = TRACE_FN,
885 .trace = trace_fn_trace, 905 .trace = trace_fn_trace,
886 .raw = trace_fn_raw, 906 .raw = trace_fn_raw,
887 .hex = trace_fn_hex, 907 .hex = trace_fn_hex,
888 .binary = trace_fn_bin, 908 .binary = trace_fn_bin,
889}; 909};
890 910
911static struct trace_event trace_fn_event = {
912 .type = TRACE_FN,
913 .funcs = &trace_fn_funcs,
914};
915
891/* TRACE_CTX an TRACE_WAKE */ 916/* TRACE_CTX an TRACE_WAKE */
892static enum print_line_t trace_ctxwake_print(struct trace_iterator *iter, 917static enum print_line_t trace_ctxwake_print(struct trace_iterator *iter,
893 char *delim) 918 char *delim)
@@ -916,13 +941,14 @@ static enum print_line_t trace_ctxwake_print(struct trace_iterator *iter,
916 return TRACE_TYPE_HANDLED; 941 return TRACE_TYPE_HANDLED;
917} 942}
918 943
919static enum print_line_t trace_ctx_print(struct trace_iterator *iter, int flags) 944static enum print_line_t trace_ctx_print(struct trace_iterator *iter, int flags,
945 struct trace_event *event)
920{ 946{
921 return trace_ctxwake_print(iter, "==>"); 947 return trace_ctxwake_print(iter, "==>");
922} 948}
923 949
924static enum print_line_t trace_wake_print(struct trace_iterator *iter, 950static enum print_line_t trace_wake_print(struct trace_iterator *iter,
925 int flags) 951 int flags, struct trace_event *event)
926{ 952{
927 return trace_ctxwake_print(iter, " +"); 953 return trace_ctxwake_print(iter, " +");
928} 954}
@@ -950,12 +976,14 @@ static int trace_ctxwake_raw(struct trace_iterator *iter, char S)
950 return TRACE_TYPE_HANDLED; 976 return TRACE_TYPE_HANDLED;
951} 977}
952 978
953static enum print_line_t trace_ctx_raw(struct trace_iterator *iter, int flags) 979static enum print_line_t trace_ctx_raw(struct trace_iterator *iter, int flags,
980 struct trace_event *event)
954{ 981{
955 return trace_ctxwake_raw(iter, 0); 982 return trace_ctxwake_raw(iter, 0);
956} 983}
957 984
958static enum print_line_t trace_wake_raw(struct trace_iterator *iter, int flags) 985static enum print_line_t trace_wake_raw(struct trace_iterator *iter, int flags,
986 struct trace_event *event)
959{ 987{
960 return trace_ctxwake_raw(iter, '+'); 988 return trace_ctxwake_raw(iter, '+');
961} 989}
@@ -984,18 +1012,20 @@ static int trace_ctxwake_hex(struct trace_iterator *iter, char S)
984 return TRACE_TYPE_HANDLED; 1012 return TRACE_TYPE_HANDLED;
985} 1013}
986 1014
987static enum print_line_t trace_ctx_hex(struct trace_iterator *iter, int flags) 1015static enum print_line_t trace_ctx_hex(struct trace_iterator *iter, int flags,
1016 struct trace_event *event)
988{ 1017{
989 return trace_ctxwake_hex(iter, 0); 1018 return trace_ctxwake_hex(iter, 0);
990} 1019}
991 1020
992static enum print_line_t trace_wake_hex(struct trace_iterator *iter, int flags) 1021static enum print_line_t trace_wake_hex(struct trace_iterator *iter, int flags,
1022 struct trace_event *event)
993{ 1023{
994 return trace_ctxwake_hex(iter, '+'); 1024 return trace_ctxwake_hex(iter, '+');
995} 1025}
996 1026
997static enum print_line_t trace_ctxwake_bin(struct trace_iterator *iter, 1027static enum print_line_t trace_ctxwake_bin(struct trace_iterator *iter,
998 int flags) 1028 int flags, struct trace_event *event)
999{ 1029{
1000 struct ctx_switch_entry *field; 1030 struct ctx_switch_entry *field;
1001 struct trace_seq *s = &iter->seq; 1031 struct trace_seq *s = &iter->seq;
@@ -1012,81 +1042,34 @@ static enum print_line_t trace_ctxwake_bin(struct trace_iterator *iter,
1012 return TRACE_TYPE_HANDLED; 1042 return TRACE_TYPE_HANDLED;
1013} 1043}
1014 1044
1015static struct trace_event trace_ctx_event = { 1045static struct trace_event_functions trace_ctx_funcs = {
1016 .type = TRACE_CTX,
1017 .trace = trace_ctx_print, 1046 .trace = trace_ctx_print,
1018 .raw = trace_ctx_raw, 1047 .raw = trace_ctx_raw,
1019 .hex = trace_ctx_hex, 1048 .hex = trace_ctx_hex,
1020 .binary = trace_ctxwake_bin, 1049 .binary = trace_ctxwake_bin,
1021}; 1050};
1022 1051
1023static struct trace_event trace_wake_event = { 1052static struct trace_event trace_ctx_event = {
1024 .type = TRACE_WAKE, 1053 .type = TRACE_CTX,
1054 .funcs = &trace_ctx_funcs,
1055};
1056
1057static struct trace_event_functions trace_wake_funcs = {
1025 .trace = trace_wake_print, 1058 .trace = trace_wake_print,
1026 .raw = trace_wake_raw, 1059 .raw = trace_wake_raw,
1027 .hex = trace_wake_hex, 1060 .hex = trace_wake_hex,
1028 .binary = trace_ctxwake_bin, 1061 .binary = trace_ctxwake_bin,
1029}; 1062};
1030 1063
1031/* TRACE_SPECIAL */ 1064static struct trace_event trace_wake_event = {
1032static enum print_line_t trace_special_print(struct trace_iterator *iter, 1065 .type = TRACE_WAKE,
1033 int flags) 1066 .funcs = &trace_wake_funcs,
1034{
1035 struct special_entry *field;
1036
1037 trace_assign_type(field, iter->ent);
1038
1039 if (!trace_seq_printf(&iter->seq, "# %ld %ld %ld\n",
1040 field->arg1,
1041 field->arg2,
1042 field->arg3))
1043 return TRACE_TYPE_PARTIAL_LINE;
1044
1045 return TRACE_TYPE_HANDLED;
1046}
1047
1048static enum print_line_t trace_special_hex(struct trace_iterator *iter,
1049 int flags)
1050{
1051 struct special_entry *field;
1052 struct trace_seq *s = &iter->seq;
1053
1054 trace_assign_type(field, iter->ent);
1055
1056 SEQ_PUT_HEX_FIELD_RET(s, field->arg1);
1057 SEQ_PUT_HEX_FIELD_RET(s, field->arg2);
1058 SEQ_PUT_HEX_FIELD_RET(s, field->arg3);
1059
1060 return TRACE_TYPE_HANDLED;
1061}
1062
1063static enum print_line_t trace_special_bin(struct trace_iterator *iter,
1064 int flags)
1065{
1066 struct special_entry *field;
1067 struct trace_seq *s = &iter->seq;
1068
1069 trace_assign_type(field, iter->ent);
1070
1071 SEQ_PUT_FIELD_RET(s, field->arg1);
1072 SEQ_PUT_FIELD_RET(s, field->arg2);
1073 SEQ_PUT_FIELD_RET(s, field->arg3);
1074
1075 return TRACE_TYPE_HANDLED;
1076}
1077
1078static struct trace_event trace_special_event = {
1079 .type = TRACE_SPECIAL,
1080 .trace = trace_special_print,
1081 .raw = trace_special_print,
1082 .hex = trace_special_hex,
1083 .binary = trace_special_bin,
1084}; 1067};
1085 1068
1086/* TRACE_STACK */ 1069/* TRACE_STACK */
1087 1070
1088static enum print_line_t trace_stack_print(struct trace_iterator *iter, 1071static enum print_line_t trace_stack_print(struct trace_iterator *iter,
1089 int flags) 1072 int flags, struct trace_event *event)
1090{ 1073{
1091 struct stack_entry *field; 1074 struct stack_entry *field;
1092 struct trace_seq *s = &iter->seq; 1075 struct trace_seq *s = &iter->seq;
@@ -1114,17 +1097,18 @@ static enum print_line_t trace_stack_print(struct trace_iterator *iter,
1114 return TRACE_TYPE_PARTIAL_LINE; 1097 return TRACE_TYPE_PARTIAL_LINE;
1115} 1098}
1116 1099
1100static struct trace_event_functions trace_stack_funcs = {
1101 .trace = trace_stack_print,
1102};
1103
1117static struct trace_event trace_stack_event = { 1104static struct trace_event trace_stack_event = {
1118 .type = TRACE_STACK, 1105 .type = TRACE_STACK,
1119 .trace = trace_stack_print, 1106 .funcs = &trace_stack_funcs,
1120 .raw = trace_special_print,
1121 .hex = trace_special_hex,
1122 .binary = trace_special_bin,
1123}; 1107};
1124 1108
1125/* TRACE_USER_STACK */ 1109/* TRACE_USER_STACK */
1126static enum print_line_t trace_user_stack_print(struct trace_iterator *iter, 1110static enum print_line_t trace_user_stack_print(struct trace_iterator *iter,
1127 int flags) 1111 int flags, struct trace_event *event)
1128{ 1112{
1129 struct userstack_entry *field; 1113 struct userstack_entry *field;
1130 struct trace_seq *s = &iter->seq; 1114 struct trace_seq *s = &iter->seq;
@@ -1143,17 +1127,19 @@ static enum print_line_t trace_user_stack_print(struct trace_iterator *iter,
1143 return TRACE_TYPE_PARTIAL_LINE; 1127 return TRACE_TYPE_PARTIAL_LINE;
1144} 1128}
1145 1129
1130static struct trace_event_functions trace_user_stack_funcs = {
1131 .trace = trace_user_stack_print,
1132};
1133
1146static struct trace_event trace_user_stack_event = { 1134static struct trace_event trace_user_stack_event = {
1147 .type = TRACE_USER_STACK, 1135 .type = TRACE_USER_STACK,
1148 .trace = trace_user_stack_print, 1136 .funcs = &trace_user_stack_funcs,
1149 .raw = trace_special_print,
1150 .hex = trace_special_hex,
1151 .binary = trace_special_bin,
1152}; 1137};
1153 1138
1154/* TRACE_BPRINT */ 1139/* TRACE_BPRINT */
1155static enum print_line_t 1140static enum print_line_t
1156trace_bprint_print(struct trace_iterator *iter, int flags) 1141trace_bprint_print(struct trace_iterator *iter, int flags,
1142 struct trace_event *event)
1157{ 1143{
1158 struct trace_entry *entry = iter->ent; 1144 struct trace_entry *entry = iter->ent;
1159 struct trace_seq *s = &iter->seq; 1145 struct trace_seq *s = &iter->seq;
@@ -1178,7 +1164,8 @@ trace_bprint_print(struct trace_iterator *iter, int flags)
1178 1164
1179 1165
1180static enum print_line_t 1166static enum print_line_t
1181trace_bprint_raw(struct trace_iterator *iter, int flags) 1167trace_bprint_raw(struct trace_iterator *iter, int flags,
1168 struct trace_event *event)
1182{ 1169{
1183 struct bprint_entry *field; 1170 struct bprint_entry *field;
1184 struct trace_seq *s = &iter->seq; 1171 struct trace_seq *s = &iter->seq;
@@ -1197,16 +1184,19 @@ trace_bprint_raw(struct trace_iterator *iter, int flags)
1197 return TRACE_TYPE_PARTIAL_LINE; 1184 return TRACE_TYPE_PARTIAL_LINE;
1198} 1185}
1199 1186
1187static struct trace_event_functions trace_bprint_funcs = {
1188 .trace = trace_bprint_print,
1189 .raw = trace_bprint_raw,
1190};
1200 1191
1201static struct trace_event trace_bprint_event = { 1192static struct trace_event trace_bprint_event = {
1202 .type = TRACE_BPRINT, 1193 .type = TRACE_BPRINT,
1203 .trace = trace_bprint_print, 1194 .funcs = &trace_bprint_funcs,
1204 .raw = trace_bprint_raw,
1205}; 1195};
1206 1196
1207/* TRACE_PRINT */ 1197/* TRACE_PRINT */
1208static enum print_line_t trace_print_print(struct trace_iterator *iter, 1198static enum print_line_t trace_print_print(struct trace_iterator *iter,
1209 int flags) 1199 int flags, struct trace_event *event)
1210{ 1200{
1211 struct print_entry *field; 1201 struct print_entry *field;
1212 struct trace_seq *s = &iter->seq; 1202 struct trace_seq *s = &iter->seq;
@@ -1225,7 +1215,8 @@ static enum print_line_t trace_print_print(struct trace_iterator *iter,
1225 return TRACE_TYPE_PARTIAL_LINE; 1215 return TRACE_TYPE_PARTIAL_LINE;
1226} 1216}
1227 1217
1228static enum print_line_t trace_print_raw(struct trace_iterator *iter, int flags) 1218static enum print_line_t trace_print_raw(struct trace_iterator *iter, int flags,
1219 struct trace_event *event)
1229{ 1220{
1230 struct print_entry *field; 1221 struct print_entry *field;
1231 1222
@@ -1240,18 +1231,21 @@ static enum print_line_t trace_print_raw(struct trace_iterator *iter, int flags)
1240 return TRACE_TYPE_PARTIAL_LINE; 1231 return TRACE_TYPE_PARTIAL_LINE;
1241} 1232}
1242 1233
1243static struct trace_event trace_print_event = { 1234static struct trace_event_functions trace_print_funcs = {
1244 .type = TRACE_PRINT,
1245 .trace = trace_print_print, 1235 .trace = trace_print_print,
1246 .raw = trace_print_raw, 1236 .raw = trace_print_raw,
1247}; 1237};
1248 1238
1239static struct trace_event trace_print_event = {
1240 .type = TRACE_PRINT,
1241 .funcs = &trace_print_funcs,
1242};
1243
1249 1244
1250static struct trace_event *events[] __initdata = { 1245static struct trace_event *events[] __initdata = {
1251 &trace_fn_event, 1246 &trace_fn_event,
1252 &trace_ctx_event, 1247 &trace_ctx_event,
1253 &trace_wake_event, 1248 &trace_wake_event,
1254 &trace_special_event,
1255 &trace_stack_event, 1249 &trace_stack_event,
1256 &trace_user_stack_event, 1250 &trace_user_stack_event,
1257 &trace_bprint_event, 1251 &trace_bprint_event,