aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/trace/blktrace.c62
1 files changed, 30 insertions, 32 deletions
diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c
index 2f21d7761600..c103b0c20022 100644
--- a/kernel/trace/blktrace.c
+++ b/kernel/trace/blktrace.c
@@ -986,29 +986,31 @@ static void get_pdu_remap(const struct trace_entry *ent,
986 r->sector = be64_to_cpu(sector); 986 r->sector = be64_to_cpu(sector);
987} 987}
988 988
989static int blk_log_action_iter(struct trace_iterator *iter, const char *act) 989typedef int (blk_log_action_t) (struct trace_iterator *iter, const char *act);
990
991static int blk_log_action_classic(struct trace_iterator *iter, const char *act)
990{ 992{
991 char rwbs[6]; 993 char rwbs[6];
992 unsigned long long ts = iter->ts; 994 unsigned long long ts = iter->ts;
993 unsigned long nsec_rem = do_div(ts, NSEC_PER_SEC); 995 unsigned long nsec_rem = do_div(ts, NSEC_PER_SEC);
994 unsigned secs = (unsigned long)ts; 996 unsigned secs = (unsigned long)ts;
995 const struct trace_entry *ent = iter->ent; 997 const struct blk_io_trace *t = te_blk_io_trace(iter->ent);
996 const struct blk_io_trace *t = (const struct blk_io_trace *)ent;
997 998
998 fill_rwbs(rwbs, t); 999 fill_rwbs(rwbs, t);
999 1000
1000 return trace_seq_printf(&iter->seq, 1001 return trace_seq_printf(&iter->seq,
1001 "%3d,%-3d %2d %5d.%09lu %5u %2s %3s ", 1002 "%3d,%-3d %2d %5d.%09lu %5u %2s %3s ",
1002 MAJOR(t->device), MINOR(t->device), iter->cpu, 1003 MAJOR(t->device), MINOR(t->device), iter->cpu,
1003 secs, nsec_rem, ent->pid, act, rwbs); 1004 secs, nsec_rem, iter->ent->pid, act, rwbs);
1004} 1005}
1005 1006
1006static int blk_log_action_seq(struct trace_seq *s, const struct blk_io_trace *t, 1007static int blk_log_action(struct trace_iterator *iter, const char *act)
1007 const char *act)
1008{ 1008{
1009 char rwbs[6]; 1009 char rwbs[6];
1010 const struct blk_io_trace *t = te_blk_io_trace(iter->ent);
1011
1010 fill_rwbs(rwbs, t); 1012 fill_rwbs(rwbs, t);
1011 return trace_seq_printf(s, "%3d,%-3d %2s %3s ", 1013 return trace_seq_printf(&iter->seq, "%3d,%-3d %2s %3s ",
1012 MAJOR(t->device), MINOR(t->device), act, rwbs); 1014 MAJOR(t->device), MINOR(t->device), act, rwbs);
1013} 1015}
1014 1016
@@ -1129,22 +1131,25 @@ static const struct {
1129 [__BLK_TA_REMAP] = {{ "A", "remap" }, blk_log_remap }, 1131 [__BLK_TA_REMAP] = {{ "A", "remap" }, blk_log_remap },
1130}; 1132};
1131 1133
1132static enum print_line_t blk_trace_event_print(struct trace_iterator *iter, 1134static enum print_line_t print_one_line(struct trace_iterator *iter,
1133 int flags) 1135 bool classic)
1134{ 1136{
1135 struct trace_seq *s = &iter->seq; 1137 struct trace_seq *s = &iter->seq;
1136 const struct blk_io_trace *t = (struct blk_io_trace *)iter->ent; 1138 const struct blk_io_trace *t;
1137 const u16 what = t->action & ((1 << BLK_TC_SHIFT) - 1); 1139 u16 what;
1138 int ret; 1140 int ret;
1141 bool long_act;
1142 blk_log_action_t *log_action;
1139 1143
1140 if (!trace_print_context(iter)) 1144 t = te_blk_io_trace(iter->ent);
1141 return TRACE_TYPE_PARTIAL_LINE; 1145 what = t->action & ((1 << BLK_TC_SHIFT) - 1);
1146 long_act = !!(trace_flags & TRACE_ITER_VERBOSE);
1147 log_action = classic ? &blk_log_action_classic : &blk_log_action;
1142 1148
1143 if (unlikely(what == 0 || what >= ARRAY_SIZE(what2act))) 1149 if (unlikely(what == 0 || what >= ARRAY_SIZE(what2act)))
1144 ret = trace_seq_printf(s, "Bad pc action %x\n", what); 1150 ret = trace_seq_printf(s, "Bad pc action %x\n", what);
1145 else { 1151 else {
1146 const bool long_act = !!(trace_flags & TRACE_ITER_VERBOSE); 1152 ret = log_action(iter, what2act[what].act[long_act]);
1147 ret = blk_log_action_seq(s, t, what2act[what].act[long_act]);
1148 if (ret) 1153 if (ret)
1149 ret = what2act[what].print(s, iter->ent); 1154 ret = what2act[what].print(s, iter->ent);
1150 } 1155 }
@@ -1152,6 +1157,15 @@ static enum print_line_t blk_trace_event_print(struct trace_iterator *iter,
1152 return ret ? TRACE_TYPE_HANDLED : TRACE_TYPE_PARTIAL_LINE; 1157 return ret ? TRACE_TYPE_HANDLED : TRACE_TYPE_PARTIAL_LINE;
1153} 1158}
1154 1159
1160static enum print_line_t blk_trace_event_print(struct trace_iterator *iter,
1161 int flags)
1162{
1163 if (!trace_print_context(iter))
1164 return TRACE_TYPE_PARTIAL_LINE;
1165
1166 return print_one_line(iter, false);
1167}
1168
1155static int blk_trace_synthesize_old_trace(struct trace_iterator *iter) 1169static int blk_trace_synthesize_old_trace(struct trace_iterator *iter)
1156{ 1170{
1157 struct trace_seq *s = &iter->seq; 1171 struct trace_seq *s = &iter->seq;
@@ -1177,26 +1191,10 @@ blk_trace_event_print_binary(struct trace_iterator *iter, int flags)
1177 1191
1178static enum print_line_t blk_tracer_print_line(struct trace_iterator *iter) 1192static enum print_line_t blk_tracer_print_line(struct trace_iterator *iter)
1179{ 1193{
1180 const struct blk_io_trace *t;
1181 u16 what;
1182 int ret;
1183
1184 if (!(blk_tracer_flags.val & TRACE_BLK_OPT_CLASSIC)) 1194 if (!(blk_tracer_flags.val & TRACE_BLK_OPT_CLASSIC))
1185 return TRACE_TYPE_UNHANDLED; 1195 return TRACE_TYPE_UNHANDLED;
1186 1196
1187 t = (const struct blk_io_trace *)iter->ent; 1197 return print_one_line(iter, true);
1188 what = t->action & ((1 << BLK_TC_SHIFT) - 1);
1189
1190 if (unlikely(what == 0 || what >= ARRAY_SIZE(what2act)))
1191 ret = trace_seq_printf(&iter->seq, "Bad pc action %x\n", what);
1192 else {
1193 const bool long_act = !!(trace_flags & TRACE_ITER_VERBOSE);
1194 ret = blk_log_action_iter(iter, what2act[what].act[long_act]);
1195 if (ret)
1196 ret = what2act[what].print(&iter->seq, iter->ent);
1197 }
1198
1199 return ret ? TRACE_TYPE_HANDLED : TRACE_TYPE_PARTIAL_LINE;
1200} 1198}
1201 1199
1202static struct tracer blk_tracer __read_mostly = { 1200static struct tracer blk_tracer __read_mostly = {