diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2009-02-02 17:30:40 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-02-03 08:03:53 -0500 |
commit | 08a06b83ff8b2779289f733348c669f31cb65d51 (patch) | |
tree | c8d5c13361ff9aa8e45cd660fbcad264b8310100 /block | |
parent | 2c9b238eb325895d3312dad64e2685783575e474 (diff) |
blkftrace: binary tracing, synthesizing old format
Impact: new feature
With this and a blkrawverify modified not to verify the sequence numbers
we can start using the userspace tools to verify that the data produced
with the ftrace plugin works as expected.
Example:
[root@f10-1 ~]# echo 1 > /sys/block/sda/sda1/trace/enable
[root@f10-1 ~]# echo bin > /d/tracing/trace_options
[root@f10-1 ~]# echo blk > /d/tracing/current_tracer
[root@f10-1 ~]# cat /d/tracing/trace_pipe > sda1.blktrace.0
^C
[root@f10-1 ~]# ./blkrawverify --noseq sda1
Verifying sda1
CPU 0
Wrote output to sda1.verify.out
[root@f10-1 ~]# cat sda1.verify.out
---------------
Verifying sda1
---------------------
Summary for cpu 0:
1349 valid + 0 invalid (100.0%) processed
[root@f10-1 ~]#
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'block')
-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) |