diff options
-rw-r--r-- | block/blktrace.c | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/block/blktrace.c b/block/blktrace.c index 570cd3c40bd1..4f45b343690a 100644 --- a/block/blktrace.c +++ b/block/blktrace.c | |||
@@ -219,9 +219,16 @@ static void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes, | |||
219 | t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION; | 219 | t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION; |
220 | t->sequence = ++(*sequence); | 220 | t->sequence = ++(*sequence); |
221 | t->time = ktime_to_ns(ktime_get()); | 221 | t->time = ktime_to_ns(ktime_get()); |
222 | t->cpu = cpu; | ||
223 | t->pid = pid; | ||
224 | record_it: | 222 | record_it: |
223 | /* | ||
224 | * These two are not needed in ftrace as they are in the | ||
225 | * generic trace_entry, filled by tracing_generic_entry_update, | ||
226 | * but for the trace_event->bin() synthesizer benefit we do it | ||
227 | * here too. | ||
228 | */ | ||
229 | t->cpu = cpu; | ||
230 | t->pid = pid; | ||
231 | |||
225 | t->sector = sector; | 232 | t->sector = sector; |
226 | t->bytes = bytes; | 233 | t->bytes = bytes; |
227 | t->action = what; | 234 | t->action = what; |
@@ -1086,6 +1093,7 @@ static void blk_tracer_start(struct trace_array *tr) | |||
1086 | if (blk_register_tracepoints()) | 1093 | if (blk_register_tracepoints()) |
1087 | atomic_dec(&blk_probes_ref); | 1094 | atomic_dec(&blk_probes_ref); |
1088 | mutex_unlock(&blk_probe_mutex); | 1095 | mutex_unlock(&blk_probe_mutex); |
1096 | trace_flags &= ~TRACE_ITER_CONTEXT_INFO; | ||
1089 | } | 1097 | } |
1090 | 1098 | ||
1091 | static int blk_tracer_init(struct trace_array *tr) | 1099 | static int blk_tracer_init(struct trace_array *tr) |
@@ -1100,6 +1108,7 @@ static int blk_tracer_init(struct trace_array *tr) | |||
1100 | 1108 | ||
1101 | static void blk_tracer_stop(struct trace_array *tr) | 1109 | static void blk_tracer_stop(struct trace_array *tr) |
1102 | { | 1110 | { |
1111 | trace_flags |= TRACE_ITER_CONTEXT_INFO; | ||
1103 | mutex_lock(&blk_probe_mutex); | 1112 | mutex_lock(&blk_probe_mutex); |
1104 | if (atomic_dec_and_test(&blk_probes_ref)) | 1113 | if (atomic_dec_and_test(&blk_probes_ref)) |
1105 | blk_unregister_tracepoints(); | 1114 | blk_unregister_tracepoints(); |
@@ -1147,6 +1156,9 @@ static int blk_trace_event_print(struct trace_iterator *iter, int flags) | |||
1147 | const u16 what = t->action & ((1 << BLK_TC_SHIFT) - 1); | 1156 | const u16 what = t->action & ((1 << BLK_TC_SHIFT) - 1); |
1148 | int ret; | 1157 | int ret; |
1149 | 1158 | ||
1159 | if (trace_print_context(iter)) | ||
1160 | return TRACE_TYPE_PARTIAL_LINE; | ||
1161 | |||
1150 | if (unlikely(what == 0 || what > ARRAY_SIZE(what2act))) | 1162 | if (unlikely(what == 0 || what > ARRAY_SIZE(what2act))) |
1151 | ret = trace_seq_printf(s, "Bad pc action %x\n", what); | 1163 | ret = trace_seq_printf(s, "Bad pc action %x\n", what); |
1152 | else { | 1164 | else { |
@@ -1159,6 +1171,28 @@ static int blk_trace_event_print(struct trace_iterator *iter, int flags) | |||
1159 | return ret ? TRACE_TYPE_HANDLED : TRACE_TYPE_PARTIAL_LINE; | 1171 | return ret ? TRACE_TYPE_HANDLED : TRACE_TYPE_PARTIAL_LINE; |
1160 | } | 1172 | } |
1161 | 1173 | ||
1174 | static int blk_trace_synthesize_old_trace(struct trace_iterator *iter) | ||
1175 | { | ||
1176 | struct trace_seq *s = &iter->seq; | ||
1177 | struct blk_io_trace *t = (struct blk_io_trace *)iter->ent; | ||
1178 | const int offset = offsetof(struct blk_io_trace, sector); | ||
1179 | struct blk_io_trace old = { | ||
1180 | .magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION, | ||
1181 | .time = ns2usecs(iter->ts), | ||
1182 | }; | ||
1183 | |||
1184 | if (!trace_seq_putmem(s, &old, offset)) | ||
1185 | return 0; | ||
1186 | return trace_seq_putmem(s, &t->sector, | ||
1187 | sizeof(old) - offset + t->pdu_len); | ||
1188 | } | ||
1189 | |||
1190 | static int blk_trace_event_print_binary(struct trace_iterator *iter, int flags) | ||
1191 | { | ||
1192 | return blk_trace_synthesize_old_trace(iter) ? | ||
1193 | TRACE_TYPE_HANDLED : TRACE_TYPE_PARTIAL_LINE; | ||
1194 | } | ||
1195 | |||
1162 | static enum print_line_t blk_tracer_print_line(struct trace_iterator *iter) | 1196 | static enum print_line_t blk_tracer_print_line(struct trace_iterator *iter) |
1163 | { | 1197 | { |
1164 | const struct blk_io_trace *t; | 1198 | const struct blk_io_trace *t; |
@@ -1200,7 +1234,7 @@ static struct trace_event trace_blk_event = { | |||
1200 | .latency_trace = blk_trace_event_print, | 1234 | .latency_trace = blk_trace_event_print, |
1201 | .raw = trace_nop_print, | 1235 | .raw = trace_nop_print, |
1202 | .hex = trace_nop_print, | 1236 | .hex = trace_nop_print, |
1203 | .binary = trace_nop_print, | 1237 | .binary = blk_trace_event_print_binary, |
1204 | }; | 1238 | }; |
1205 | 1239 | ||
1206 | static int __init init_blk_tracer(void) | 1240 | static int __init init_blk_tracer(void) |