blktrace: fix output of BLK_TC_PC events
BLK_TC_PC events should be treated differently with BLK_TC_FS events. Before this patch: # echo 1 > /sys/block/sda/sda1/trace/enable # echo pc > /sys/block/sda/sda1/trace/act_mask # echo blk > /debugfs/tracing/current_tracer # (generate some BLK_TC_PC events) # cat trace bash-2184 [000] 1774.275413: 8,7 I N [bash] bash-2184 [000] 1774.275435: 8,7 D N [bash] bash-2184 [000] 1774.275540: 8,7 I R [bash] bash-2184 [000] 1774.275547: 8,7 D R [bash] ksoftirqd/0-4 [000] 1774.275580: 8,7 C N 0 [0] bash-2184 [000] 1774.275648: 8,7 I R [bash] bash-2184 [000] 1774.275653: 8,7 D R [bash] ksoftirqd/0-4 [000] 1774.275682: 8,7 C N 0 [0] bash-2184 [000] 1774.275739: 8,7 I R [bash] bash-2184 [000] 1774.275744: 8,7 D R [bash] ksoftirqd/0-4 [000] 1774.275771: 8,7 C N 0 [0] bash-2184 [000] 1774.275804: 8,7 I R [bash] bash-2184 [000] 1774.275808: 8,7 D R [bash] ksoftirqd/0-4 [000] 1774.275836: 8,7 C N 0 [0] After this patch: # cat trace bash-2263 [000] 366.782149: 8,7 I N 0 (00 ..) [bash] bash-2263 [000] 366.782323: 8,7 D N 0 (00 ..) [bash] bash-2263 [000] 366.782557: 8,7 I R 8 (25 00 ..) [bash] bash-2263 [000] 366.782560: 8,7 D R 8 (25 00 ..) [bash] ksoftirqd/0-4 [000] 366.782582: 8,7 C N (25 00 ..) [0] bash-2263 [000] 366.782648: 8,7 I R 8 (5a 00 3f 00) [bash] bash-2263 [000] 366.782650: 8,7 D R 8 (5a 00 3f 00) [bash] ksoftirqd/0-4 [000] 366.782669: 8,7 C N (5a 00 3f 00) [0] bash-2263 [000] 366.782710: 8,7 I R 8 (5a 00 08 00) [bash] bash-2263 [000] 366.782713: 8,7 D R 8 (5a 00 08 00) [bash] ksoftirqd/0-4 [000] 366.782730: 8,7 C N (5a 00 08 00) [0] bash-2263 [000] 366.783375: 8,7 I R 36 (5a 00 08 00) [bash] bash-2263 [000] 366.783379: 8,7 D R 36 (5a 00 08 00) [bash] ksoftirqd/0-4 [000] 366.783404: 8,7 C N (5a 00 08 00) [0] This is what we do with PC events in user-space blktrace. Signed-off-by: Li Zefan <lizf@cn.fujitsu.com> Acked-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Jens Axboe <jens.axboe@oracle.com> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Frederic Weisbecker <fweisbec@gmail.com> LKML-Reference: <49D32387.9040106@cn.fujitsu.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
b78825d608
commit
66de7792c0
|
@ -971,6 +971,16 @@ static inline const void *pdu_start(const struct trace_entry *ent)
|
||||||
return te_blk_io_trace(ent) + 1;
|
return te_blk_io_trace(ent) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline u32 t_action(const struct trace_entry *ent)
|
||||||
|
{
|
||||||
|
return te_blk_io_trace(ent)->action;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u32 t_bytes(const struct trace_entry *ent)
|
||||||
|
{
|
||||||
|
return te_blk_io_trace(ent)->bytes;
|
||||||
|
}
|
||||||
|
|
||||||
static inline u32 t_sec(const struct trace_entry *ent)
|
static inline u32 t_sec(const struct trace_entry *ent)
|
||||||
{
|
{
|
||||||
return te_blk_io_trace(ent)->bytes >> 9;
|
return te_blk_io_trace(ent)->bytes >> 9;
|
||||||
|
@ -1031,25 +1041,87 @@ static int blk_log_action(struct trace_iterator *iter, const char *act)
|
||||||
MAJOR(t->device), MINOR(t->device), act, rwbs);
|
MAJOR(t->device), MINOR(t->device), act, rwbs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int blk_log_dump_pdu(struct trace_seq *s, const struct trace_entry *ent)
|
||||||
|
{
|
||||||
|
const char *pdu_buf;
|
||||||
|
int pdu_len;
|
||||||
|
int i, end, ret;
|
||||||
|
|
||||||
|
pdu_buf = pdu_start(ent);
|
||||||
|
pdu_len = te_blk_io_trace(ent)->pdu_len;
|
||||||
|
|
||||||
|
if (!pdu_len)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/* find the last zero that needs to be printed */
|
||||||
|
for (end = pdu_len - 1; end >= 0; end--)
|
||||||
|
if (pdu_buf[end])
|
||||||
|
break;
|
||||||
|
end++;
|
||||||
|
|
||||||
|
if (!trace_seq_putc(s, '('))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (i = 0; i < pdu_len; i++) {
|
||||||
|
|
||||||
|
ret = trace_seq_printf(s, "%s%02x",
|
||||||
|
i == 0 ? "" : " ", pdu_buf[i]);
|
||||||
|
if (!ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* stop when the rest is just zeroes and indicate so
|
||||||
|
* with a ".." appended
|
||||||
|
*/
|
||||||
|
if (i == end && end != pdu_len - 1)
|
||||||
|
return trace_seq_puts(s, " ..) ");
|
||||||
|
}
|
||||||
|
|
||||||
|
return trace_seq_puts(s, ") ");
|
||||||
|
}
|
||||||
|
|
||||||
static int blk_log_generic(struct trace_seq *s, const struct trace_entry *ent)
|
static int blk_log_generic(struct trace_seq *s, const struct trace_entry *ent)
|
||||||
{
|
{
|
||||||
char cmd[TASK_COMM_LEN];
|
char cmd[TASK_COMM_LEN];
|
||||||
|
|
||||||
trace_find_cmdline(ent->pid, cmd);
|
trace_find_cmdline(ent->pid, cmd);
|
||||||
|
|
||||||
|
if (t_action(ent) & BLK_TC_ACT(BLK_TC_PC)) {
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = trace_seq_printf(s, "%u ", t_bytes(ent));
|
||||||
|
if (!ret)
|
||||||
|
return 0;
|
||||||
|
ret = blk_log_dump_pdu(s, ent);
|
||||||
|
if (!ret)
|
||||||
|
return 0;
|
||||||
|
return trace_seq_printf(s, "[%s]\n", cmd);
|
||||||
|
} else {
|
||||||
if (t_sec(ent))
|
if (t_sec(ent))
|
||||||
return trace_seq_printf(s, "%llu + %u [%s]\n",
|
return trace_seq_printf(s, "%llu + %u [%s]\n",
|
||||||
t_sector(ent), t_sec(ent), cmd);
|
t_sector(ent), t_sec(ent), cmd);
|
||||||
return trace_seq_printf(s, "[%s]\n", cmd);
|
return trace_seq_printf(s, "[%s]\n", cmd);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int blk_log_with_error(struct trace_seq *s,
|
static int blk_log_with_error(struct trace_seq *s,
|
||||||
const struct trace_entry *ent)
|
const struct trace_entry *ent)
|
||||||
{
|
{
|
||||||
|
if (t_action(ent) & BLK_TC_ACT(BLK_TC_PC)) {
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = blk_log_dump_pdu(s, ent);
|
||||||
|
if (ret)
|
||||||
|
return trace_seq_printf(s, "[%d]\n", t_error(ent));
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
if (t_sec(ent))
|
if (t_sec(ent))
|
||||||
return trace_seq_printf(s, "%llu + %u [%d]\n", t_sector(ent),
|
return trace_seq_printf(s, "%llu + %u [%d]\n",
|
||||||
|
t_sector(ent),
|
||||||
t_sec(ent), t_error(ent));
|
t_sec(ent), t_error(ent));
|
||||||
return trace_seq_printf(s, "%llu [%d]\n", t_sector(ent), t_error(ent));
|
return trace_seq_printf(s, "%llu [%d]\n",
|
||||||
|
t_sector(ent), t_error(ent));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int blk_log_remap(struct trace_seq *s, const struct trace_entry *ent)
|
static int blk_log_remap(struct trace_seq *s, const struct trace_entry *ent)
|
||||||
|
|
Loading…
Reference in New Issue