diff options
Diffstat (limited to 'kernel/trace/trace_output.c')
-rw-r--r-- | kernel/trace/trace_output.c | 137 |
1 files changed, 92 insertions, 45 deletions
diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c index 2404c129a8c9..fc9d4dbb089e 100644 --- a/kernel/trace/trace_output.c +++ b/kernel/trace/trace_output.c | |||
@@ -726,6 +726,9 @@ int register_ftrace_event(struct trace_event *event) | |||
726 | if (WARN_ON(!event)) | 726 | if (WARN_ON(!event)) |
727 | goto out; | 727 | goto out; |
728 | 728 | ||
729 | if (WARN_ON(!event->funcs)) | ||
730 | goto out; | ||
731 | |||
729 | INIT_LIST_HEAD(&event->list); | 732 | INIT_LIST_HEAD(&event->list); |
730 | 733 | ||
731 | if (!event->type) { | 734 | if (!event->type) { |
@@ -758,14 +761,14 @@ int register_ftrace_event(struct trace_event *event) | |||
758 | goto out; | 761 | goto out; |
759 | } | 762 | } |
760 | 763 | ||
761 | if (event->trace == NULL) | 764 | if (event->funcs->trace == NULL) |
762 | event->trace = trace_nop_print; | 765 | event->funcs->trace = trace_nop_print; |
763 | if (event->raw == NULL) | 766 | if (event->funcs->raw == NULL) |
764 | event->raw = trace_nop_print; | 767 | event->funcs->raw = trace_nop_print; |
765 | if (event->hex == NULL) | 768 | if (event->funcs->hex == NULL) |
766 | event->hex = trace_nop_print; | 769 | event->funcs->hex = trace_nop_print; |
767 | if (event->binary == NULL) | 770 | if (event->funcs->binary == NULL) |
768 | event->binary = trace_nop_print; | 771 | event->funcs->binary = trace_nop_print; |
769 | 772 | ||
770 | key = event->type & (EVENT_HASHSIZE - 1); | 773 | key = event->type & (EVENT_HASHSIZE - 1); |
771 | 774 | ||
@@ -807,13 +810,15 @@ EXPORT_SYMBOL_GPL(unregister_ftrace_event); | |||
807 | * Standard events | 810 | * Standard events |
808 | */ | 811 | */ |
809 | 812 | ||
810 | enum print_line_t trace_nop_print(struct trace_iterator *iter, int flags) | 813 | enum print_line_t trace_nop_print(struct trace_iterator *iter, int flags, |
814 | struct trace_event *event) | ||
811 | { | 815 | { |
812 | return TRACE_TYPE_HANDLED; | 816 | return TRACE_TYPE_HANDLED; |
813 | } | 817 | } |
814 | 818 | ||
815 | /* TRACE_FN */ | 819 | /* TRACE_FN */ |
816 | static enum print_line_t trace_fn_trace(struct trace_iterator *iter, int flags) | 820 | static enum print_line_t trace_fn_trace(struct trace_iterator *iter, int flags, |
821 | struct trace_event *event) | ||
817 | { | 822 | { |
818 | struct ftrace_entry *field; | 823 | struct ftrace_entry *field; |
819 | struct trace_seq *s = &iter->seq; | 824 | struct trace_seq *s = &iter->seq; |
@@ -840,7 +845,8 @@ static enum print_line_t trace_fn_trace(struct trace_iterator *iter, int flags) | |||
840 | return TRACE_TYPE_PARTIAL_LINE; | 845 | return TRACE_TYPE_PARTIAL_LINE; |
841 | } | 846 | } |
842 | 847 | ||
843 | static enum print_line_t trace_fn_raw(struct trace_iterator *iter, int flags) | 848 | static enum print_line_t trace_fn_raw(struct trace_iterator *iter, int flags, |
849 | struct trace_event *event) | ||
844 | { | 850 | { |
845 | struct ftrace_entry *field; | 851 | struct ftrace_entry *field; |
846 | 852 | ||
@@ -854,7 +860,8 @@ static enum print_line_t trace_fn_raw(struct trace_iterator *iter, int flags) | |||
854 | return TRACE_TYPE_HANDLED; | 860 | return TRACE_TYPE_HANDLED; |
855 | } | 861 | } |
856 | 862 | ||
857 | static enum print_line_t trace_fn_hex(struct trace_iterator *iter, int flags) | 863 | static enum print_line_t trace_fn_hex(struct trace_iterator *iter, int flags, |
864 | struct trace_event *event) | ||
858 | { | 865 | { |
859 | struct ftrace_entry *field; | 866 | struct ftrace_entry *field; |
860 | struct trace_seq *s = &iter->seq; | 867 | struct trace_seq *s = &iter->seq; |
@@ -867,7 +874,8 @@ static enum print_line_t trace_fn_hex(struct trace_iterator *iter, int flags) | |||
867 | return TRACE_TYPE_HANDLED; | 874 | return TRACE_TYPE_HANDLED; |
868 | } | 875 | } |
869 | 876 | ||
870 | static enum print_line_t trace_fn_bin(struct trace_iterator *iter, int flags) | 877 | static enum print_line_t trace_fn_bin(struct trace_iterator *iter, int flags, |
878 | struct trace_event *event) | ||
871 | { | 879 | { |
872 | struct ftrace_entry *field; | 880 | struct ftrace_entry *field; |
873 | struct trace_seq *s = &iter->seq; | 881 | struct trace_seq *s = &iter->seq; |
@@ -880,14 +888,18 @@ static enum print_line_t trace_fn_bin(struct trace_iterator *iter, int flags) | |||
880 | return TRACE_TYPE_HANDLED; | 888 | return TRACE_TYPE_HANDLED; |
881 | } | 889 | } |
882 | 890 | ||
883 | static struct trace_event trace_fn_event = { | 891 | static struct trace_event_functions trace_fn_funcs = { |
884 | .type = TRACE_FN, | ||
885 | .trace = trace_fn_trace, | 892 | .trace = trace_fn_trace, |
886 | .raw = trace_fn_raw, | 893 | .raw = trace_fn_raw, |
887 | .hex = trace_fn_hex, | 894 | .hex = trace_fn_hex, |
888 | .binary = trace_fn_bin, | 895 | .binary = trace_fn_bin, |
889 | }; | 896 | }; |
890 | 897 | ||
898 | static struct trace_event trace_fn_event = { | ||
899 | .type = TRACE_FN, | ||
900 | .funcs = &trace_fn_funcs, | ||
901 | }; | ||
902 | |||
891 | /* TRACE_CTX an TRACE_WAKE */ | 903 | /* TRACE_CTX an TRACE_WAKE */ |
892 | static enum print_line_t trace_ctxwake_print(struct trace_iterator *iter, | 904 | static enum print_line_t trace_ctxwake_print(struct trace_iterator *iter, |
893 | char *delim) | 905 | char *delim) |
@@ -916,13 +928,14 @@ static enum print_line_t trace_ctxwake_print(struct trace_iterator *iter, | |||
916 | return TRACE_TYPE_HANDLED; | 928 | return TRACE_TYPE_HANDLED; |
917 | } | 929 | } |
918 | 930 | ||
919 | static enum print_line_t trace_ctx_print(struct trace_iterator *iter, int flags) | 931 | static enum print_line_t trace_ctx_print(struct trace_iterator *iter, int flags, |
932 | struct trace_event *event) | ||
920 | { | 933 | { |
921 | return trace_ctxwake_print(iter, "==>"); | 934 | return trace_ctxwake_print(iter, "==>"); |
922 | } | 935 | } |
923 | 936 | ||
924 | static enum print_line_t trace_wake_print(struct trace_iterator *iter, | 937 | static enum print_line_t trace_wake_print(struct trace_iterator *iter, |
925 | int flags) | 938 | int flags, struct trace_event *event) |
926 | { | 939 | { |
927 | return trace_ctxwake_print(iter, " +"); | 940 | return trace_ctxwake_print(iter, " +"); |
928 | } | 941 | } |
@@ -950,12 +963,14 @@ static int trace_ctxwake_raw(struct trace_iterator *iter, char S) | |||
950 | return TRACE_TYPE_HANDLED; | 963 | return TRACE_TYPE_HANDLED; |
951 | } | 964 | } |
952 | 965 | ||
953 | static enum print_line_t trace_ctx_raw(struct trace_iterator *iter, int flags) | 966 | static enum print_line_t trace_ctx_raw(struct trace_iterator *iter, int flags, |
967 | struct trace_event *event) | ||
954 | { | 968 | { |
955 | return trace_ctxwake_raw(iter, 0); | 969 | return trace_ctxwake_raw(iter, 0); |
956 | } | 970 | } |
957 | 971 | ||
958 | static enum print_line_t trace_wake_raw(struct trace_iterator *iter, int flags) | 972 | static enum print_line_t trace_wake_raw(struct trace_iterator *iter, int flags, |
973 | struct trace_event *event) | ||
959 | { | 974 | { |
960 | return trace_ctxwake_raw(iter, '+'); | 975 | return trace_ctxwake_raw(iter, '+'); |
961 | } | 976 | } |
@@ -984,18 +999,20 @@ static int trace_ctxwake_hex(struct trace_iterator *iter, char S) | |||
984 | return TRACE_TYPE_HANDLED; | 999 | return TRACE_TYPE_HANDLED; |
985 | } | 1000 | } |
986 | 1001 | ||
987 | static enum print_line_t trace_ctx_hex(struct trace_iterator *iter, int flags) | 1002 | static enum print_line_t trace_ctx_hex(struct trace_iterator *iter, int flags, |
1003 | struct trace_event *event) | ||
988 | { | 1004 | { |
989 | return trace_ctxwake_hex(iter, 0); | 1005 | return trace_ctxwake_hex(iter, 0); |
990 | } | 1006 | } |
991 | 1007 | ||
992 | static enum print_line_t trace_wake_hex(struct trace_iterator *iter, int flags) | 1008 | static enum print_line_t trace_wake_hex(struct trace_iterator *iter, int flags, |
1009 | struct trace_event *event) | ||
993 | { | 1010 | { |
994 | return trace_ctxwake_hex(iter, '+'); | 1011 | return trace_ctxwake_hex(iter, '+'); |
995 | } | 1012 | } |
996 | 1013 | ||
997 | static enum print_line_t trace_ctxwake_bin(struct trace_iterator *iter, | 1014 | static enum print_line_t trace_ctxwake_bin(struct trace_iterator *iter, |
998 | int flags) | 1015 | int flags, struct trace_event *event) |
999 | { | 1016 | { |
1000 | struct ctx_switch_entry *field; | 1017 | struct ctx_switch_entry *field; |
1001 | struct trace_seq *s = &iter->seq; | 1018 | struct trace_seq *s = &iter->seq; |
@@ -1012,25 +1029,33 @@ static enum print_line_t trace_ctxwake_bin(struct trace_iterator *iter, | |||
1012 | return TRACE_TYPE_HANDLED; | 1029 | return TRACE_TYPE_HANDLED; |
1013 | } | 1030 | } |
1014 | 1031 | ||
1015 | static struct trace_event trace_ctx_event = { | 1032 | static struct trace_event_functions trace_ctx_funcs = { |
1016 | .type = TRACE_CTX, | ||
1017 | .trace = trace_ctx_print, | 1033 | .trace = trace_ctx_print, |
1018 | .raw = trace_ctx_raw, | 1034 | .raw = trace_ctx_raw, |
1019 | .hex = trace_ctx_hex, | 1035 | .hex = trace_ctx_hex, |
1020 | .binary = trace_ctxwake_bin, | 1036 | .binary = trace_ctxwake_bin, |
1021 | }; | 1037 | }; |
1022 | 1038 | ||
1023 | static struct trace_event trace_wake_event = { | 1039 | static struct trace_event trace_ctx_event = { |
1024 | .type = TRACE_WAKE, | 1040 | .type = TRACE_CTX, |
1041 | .funcs = &trace_ctx_funcs, | ||
1042 | }; | ||
1043 | |||
1044 | static struct trace_event_functions trace_wake_funcs = { | ||
1025 | .trace = trace_wake_print, | 1045 | .trace = trace_wake_print, |
1026 | .raw = trace_wake_raw, | 1046 | .raw = trace_wake_raw, |
1027 | .hex = trace_wake_hex, | 1047 | .hex = trace_wake_hex, |
1028 | .binary = trace_ctxwake_bin, | 1048 | .binary = trace_ctxwake_bin, |
1029 | }; | 1049 | }; |
1030 | 1050 | ||
1051 | static struct trace_event trace_wake_event = { | ||
1052 | .type = TRACE_WAKE, | ||
1053 | .funcs = &trace_wake_funcs, | ||
1054 | }; | ||
1055 | |||
1031 | /* TRACE_SPECIAL */ | 1056 | /* TRACE_SPECIAL */ |
1032 | static enum print_line_t trace_special_print(struct trace_iterator *iter, | 1057 | static enum print_line_t trace_special_print(struct trace_iterator *iter, |
1033 | int flags) | 1058 | int flags, struct trace_event *event) |
1034 | { | 1059 | { |
1035 | struct special_entry *field; | 1060 | struct special_entry *field; |
1036 | 1061 | ||
@@ -1046,7 +1071,7 @@ static enum print_line_t trace_special_print(struct trace_iterator *iter, | |||
1046 | } | 1071 | } |
1047 | 1072 | ||
1048 | static enum print_line_t trace_special_hex(struct trace_iterator *iter, | 1073 | static enum print_line_t trace_special_hex(struct trace_iterator *iter, |
1049 | int flags) | 1074 | int flags, struct trace_event *event) |
1050 | { | 1075 | { |
1051 | struct special_entry *field; | 1076 | struct special_entry *field; |
1052 | struct trace_seq *s = &iter->seq; | 1077 | struct trace_seq *s = &iter->seq; |
@@ -1061,7 +1086,7 @@ static enum print_line_t trace_special_hex(struct trace_iterator *iter, | |||
1061 | } | 1086 | } |
1062 | 1087 | ||
1063 | static enum print_line_t trace_special_bin(struct trace_iterator *iter, | 1088 | static enum print_line_t trace_special_bin(struct trace_iterator *iter, |
1064 | int flags) | 1089 | int flags, struct trace_event *event) |
1065 | { | 1090 | { |
1066 | struct special_entry *field; | 1091 | struct special_entry *field; |
1067 | struct trace_seq *s = &iter->seq; | 1092 | struct trace_seq *s = &iter->seq; |
@@ -1075,18 +1100,22 @@ static enum print_line_t trace_special_bin(struct trace_iterator *iter, | |||
1075 | return TRACE_TYPE_HANDLED; | 1100 | return TRACE_TYPE_HANDLED; |
1076 | } | 1101 | } |
1077 | 1102 | ||
1078 | static struct trace_event trace_special_event = { | 1103 | static struct trace_event_functions trace_special_funcs = { |
1079 | .type = TRACE_SPECIAL, | ||
1080 | .trace = trace_special_print, | 1104 | .trace = trace_special_print, |
1081 | .raw = trace_special_print, | 1105 | .raw = trace_special_print, |
1082 | .hex = trace_special_hex, | 1106 | .hex = trace_special_hex, |
1083 | .binary = trace_special_bin, | 1107 | .binary = trace_special_bin, |
1084 | }; | 1108 | }; |
1085 | 1109 | ||
1110 | static struct trace_event trace_special_event = { | ||
1111 | .type = TRACE_SPECIAL, | ||
1112 | .funcs = &trace_special_funcs, | ||
1113 | }; | ||
1114 | |||
1086 | /* TRACE_STACK */ | 1115 | /* TRACE_STACK */ |
1087 | 1116 | ||
1088 | static enum print_line_t trace_stack_print(struct trace_iterator *iter, | 1117 | static enum print_line_t trace_stack_print(struct trace_iterator *iter, |
1089 | int flags) | 1118 | int flags, struct trace_event *event) |
1090 | { | 1119 | { |
1091 | struct stack_entry *field; | 1120 | struct stack_entry *field; |
1092 | struct trace_seq *s = &iter->seq; | 1121 | struct trace_seq *s = &iter->seq; |
@@ -1114,17 +1143,21 @@ static enum print_line_t trace_stack_print(struct trace_iterator *iter, | |||
1114 | return TRACE_TYPE_PARTIAL_LINE; | 1143 | return TRACE_TYPE_PARTIAL_LINE; |
1115 | } | 1144 | } |
1116 | 1145 | ||
1117 | static struct trace_event trace_stack_event = { | 1146 | static struct trace_event_functions trace_stack_funcs = { |
1118 | .type = TRACE_STACK, | ||
1119 | .trace = trace_stack_print, | 1147 | .trace = trace_stack_print, |
1120 | .raw = trace_special_print, | 1148 | .raw = trace_special_print, |
1121 | .hex = trace_special_hex, | 1149 | .hex = trace_special_hex, |
1122 | .binary = trace_special_bin, | 1150 | .binary = trace_special_bin, |
1123 | }; | 1151 | }; |
1124 | 1152 | ||
1153 | static struct trace_event trace_stack_event = { | ||
1154 | .type = TRACE_STACK, | ||
1155 | .funcs = &trace_stack_funcs, | ||
1156 | }; | ||
1157 | |||
1125 | /* TRACE_USER_STACK */ | 1158 | /* TRACE_USER_STACK */ |
1126 | static enum print_line_t trace_user_stack_print(struct trace_iterator *iter, | 1159 | static enum print_line_t trace_user_stack_print(struct trace_iterator *iter, |
1127 | int flags) | 1160 | int flags, struct trace_event *event) |
1128 | { | 1161 | { |
1129 | struct userstack_entry *field; | 1162 | struct userstack_entry *field; |
1130 | struct trace_seq *s = &iter->seq; | 1163 | struct trace_seq *s = &iter->seq; |
@@ -1143,17 +1176,22 @@ static enum print_line_t trace_user_stack_print(struct trace_iterator *iter, | |||
1143 | return TRACE_TYPE_PARTIAL_LINE; | 1176 | return TRACE_TYPE_PARTIAL_LINE; |
1144 | } | 1177 | } |
1145 | 1178 | ||
1146 | static struct trace_event trace_user_stack_event = { | 1179 | static struct trace_event_functions trace_user_stack_funcs = { |
1147 | .type = TRACE_USER_STACK, | ||
1148 | .trace = trace_user_stack_print, | 1180 | .trace = trace_user_stack_print, |
1149 | .raw = trace_special_print, | 1181 | .raw = trace_special_print, |
1150 | .hex = trace_special_hex, | 1182 | .hex = trace_special_hex, |
1151 | .binary = trace_special_bin, | 1183 | .binary = trace_special_bin, |
1152 | }; | 1184 | }; |
1153 | 1185 | ||
1186 | static struct trace_event trace_user_stack_event = { | ||
1187 | .type = TRACE_USER_STACK, | ||
1188 | .funcs = &trace_user_stack_funcs, | ||
1189 | }; | ||
1190 | |||
1154 | /* TRACE_BPRINT */ | 1191 | /* TRACE_BPRINT */ |
1155 | static enum print_line_t | 1192 | static enum print_line_t |
1156 | trace_bprint_print(struct trace_iterator *iter, int flags) | 1193 | trace_bprint_print(struct trace_iterator *iter, int flags, |
1194 | struct trace_event *event) | ||
1157 | { | 1195 | { |
1158 | struct trace_entry *entry = iter->ent; | 1196 | struct trace_entry *entry = iter->ent; |
1159 | struct trace_seq *s = &iter->seq; | 1197 | struct trace_seq *s = &iter->seq; |
@@ -1178,7 +1216,8 @@ trace_bprint_print(struct trace_iterator *iter, int flags) | |||
1178 | 1216 | ||
1179 | 1217 | ||
1180 | static enum print_line_t | 1218 | static enum print_line_t |
1181 | trace_bprint_raw(struct trace_iterator *iter, int flags) | 1219 | trace_bprint_raw(struct trace_iterator *iter, int flags, |
1220 | struct trace_event *event) | ||
1182 | { | 1221 | { |
1183 | struct bprint_entry *field; | 1222 | struct bprint_entry *field; |
1184 | struct trace_seq *s = &iter->seq; | 1223 | struct trace_seq *s = &iter->seq; |
@@ -1197,16 +1236,19 @@ trace_bprint_raw(struct trace_iterator *iter, int flags) | |||
1197 | return TRACE_TYPE_PARTIAL_LINE; | 1236 | return TRACE_TYPE_PARTIAL_LINE; |
1198 | } | 1237 | } |
1199 | 1238 | ||
1239 | static struct trace_event_functions trace_bprint_funcs = { | ||
1240 | .trace = trace_bprint_print, | ||
1241 | .raw = trace_bprint_raw, | ||
1242 | }; | ||
1200 | 1243 | ||
1201 | static struct trace_event trace_bprint_event = { | 1244 | static struct trace_event trace_bprint_event = { |
1202 | .type = TRACE_BPRINT, | 1245 | .type = TRACE_BPRINT, |
1203 | .trace = trace_bprint_print, | 1246 | .funcs = &trace_bprint_funcs, |
1204 | .raw = trace_bprint_raw, | ||
1205 | }; | 1247 | }; |
1206 | 1248 | ||
1207 | /* TRACE_PRINT */ | 1249 | /* TRACE_PRINT */ |
1208 | static enum print_line_t trace_print_print(struct trace_iterator *iter, | 1250 | static enum print_line_t trace_print_print(struct trace_iterator *iter, |
1209 | int flags) | 1251 | int flags, struct trace_event *event) |
1210 | { | 1252 | { |
1211 | struct print_entry *field; | 1253 | struct print_entry *field; |
1212 | struct trace_seq *s = &iter->seq; | 1254 | struct trace_seq *s = &iter->seq; |
@@ -1225,7 +1267,8 @@ static enum print_line_t trace_print_print(struct trace_iterator *iter, | |||
1225 | return TRACE_TYPE_PARTIAL_LINE; | 1267 | return TRACE_TYPE_PARTIAL_LINE; |
1226 | } | 1268 | } |
1227 | 1269 | ||
1228 | static enum print_line_t trace_print_raw(struct trace_iterator *iter, int flags) | 1270 | static enum print_line_t trace_print_raw(struct trace_iterator *iter, int flags, |
1271 | struct trace_event *event) | ||
1229 | { | 1272 | { |
1230 | struct print_entry *field; | 1273 | struct print_entry *field; |
1231 | 1274 | ||
@@ -1240,12 +1283,16 @@ static enum print_line_t trace_print_raw(struct trace_iterator *iter, int flags) | |||
1240 | return TRACE_TYPE_PARTIAL_LINE; | 1283 | return TRACE_TYPE_PARTIAL_LINE; |
1241 | } | 1284 | } |
1242 | 1285 | ||
1243 | static struct trace_event trace_print_event = { | 1286 | static struct trace_event_functions trace_print_funcs = { |
1244 | .type = TRACE_PRINT, | ||
1245 | .trace = trace_print_print, | 1287 | .trace = trace_print_print, |
1246 | .raw = trace_print_raw, | 1288 | .raw = trace_print_raw, |
1247 | }; | 1289 | }; |
1248 | 1290 | ||
1291 | static struct trace_event trace_print_event = { | ||
1292 | .type = TRACE_PRINT, | ||
1293 | .funcs = &trace_print_funcs, | ||
1294 | }; | ||
1295 | |||
1249 | 1296 | ||
1250 | static struct trace_event *events[] __initdata = { | 1297 | static struct trace_event *events[] __initdata = { |
1251 | &trace_fn_event, | 1298 | &trace_fn_event, |