summaryrefslogtreecommitdiff
path: root/blkiomon.c
diff options
context:
space:
mode:
authorMartin Peschke <mpeschke@linux.vnet.ibm.com>2008-10-20 18:14:21 +0200
committerJens Axboe <jens.axboe@oracle.com>2008-10-20 18:14:21 +0200
commit3bc3451b471fe4cea365654481258a1a1913018e (patch)
tree8f7f71557dad6192cdf079af6acfec2b678bde5b /blkiomon.c
parentc701176c4befb44efe68e3b5e09ca710b4be357d (diff)
downloadblktrace-3bc3451b471fe4cea365654481258a1a1913018e.tar.gz
blktrace-3bc3451b471fe4cea365654481258a1a1913018e.tar.bz2
blkiomon: drv_data traces pass-through
This patch adds pass-through support for device driver specific traces to blkiomon. This way we can aggregate block I/O statistics and device driver specific statistics at the same time. Signed-off-by: Martin Peschke <mpeschke@linux.vnet.ibm.com> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'blkiomon.c')
-rw-r--r--blkiomon.c44
1 files changed, 42 insertions, 2 deletions
diff --git a/blkiomon.c b/blkiomon.c
index 3ac4360..435d5d3 100644
--- a/blkiomon.c
+++ b/blkiomon.c
@@ -88,7 +88,7 @@ static struct rb_root dstat_tree[2] = { RB_ROOT, RB_ROOT };
static struct dstat *dstat_list[2] = {};
static int dstat_curr = 0;
-static struct output human, binary, debug;
+static struct output drvdata, human, binary, debug;
static char *msg_q_name = NULL;
static int msg_q_id = -1, msg_q = -1;
@@ -427,6 +427,26 @@ static struct trace *blkiomon_do_trace(struct trace *t)
return t_old;
}
+static int blkiomon_dump_drvdata(struct blk_io_trace *bit, void *pdu_buf)
+{
+ if (!drvdata.fn)
+ return 0;
+
+ if (fwrite(bit, sizeof(*bit), 1, drvdata.fp) != 1)
+ goto failed;
+ if (fwrite(pdu_buf, bit->pdu_len, 1, drvdata.fp) != 1)
+ goto failed;
+ if (drvdata.pipe && fflush(drvdata.fp))
+ goto failed;
+ return 0;
+
+failed:
+ fprintf(stderr, "blkiomon: could not write to %s\n", drvdata.fn);
+ fclose(drvdata.fp);
+ drvdata.fn = NULL;
+ return 1;
+}
+
static int blkiomon_do_fifo(void)
{
struct trace *t;
@@ -473,6 +493,14 @@ static int blkiomon_do_fifo(void)
t->sequence = sequence++;
+ /* forward low-level device driver trace to other tool */
+ if (bit->action & BLK_TC_ACT(BLK_TC_DRV_DATA)) {
+ driverdata++;
+ if (blkiomon_dump_drvdata(bit, pdu_buf))
+ break;
+ continue;
+ }
+
if (!(bit->action & BLK_TC_ACT(BLK_TC_ISSUE | BLK_TC_COMPLETE)))
continue;
@@ -557,7 +585,7 @@ static void blkiomon_debug(void)
leftover, match, mismatch, driverdata, sequence);
}
-#define S_OPTS "b:D:h:I:Q:q:m:V"
+#define S_OPTS "b:d:D:h:I:Q:q:m:V"
static char usage_str[] = "\n\nblkiomon " \
"-I <interval> | --interval=<interval>\n" \
@@ -571,6 +599,7 @@ static char usage_str[] = "\n\nblkiomon " \
"\t-I Sample interval.\n" \
"\t-h Human-readable output file.\n" \
"\t-b Binary output file.\n" \
+ "\t-d Output file for data emitted by low level device driver.\n" \
"\t-D Output file for debugging data.\n" \
"\t-Qqm Output to message queue using given ID for messages.\n" \
"\t-V Print program version.\n\n";
@@ -589,6 +618,12 @@ static struct option l_opts[] = {
.val = 'b'
},
{
+ .name = "dump-lldd",
+ .has_arg = required_argument,
+ .flag = NULL,
+ .val = 'd'
+ },
+ {
.name = "debug",
.has_arg = required_argument,
.flag = NULL,
@@ -652,6 +687,9 @@ int main(int argc, char *argv[])
case 'b':
binary.fn = optarg;
break;
+ case 'd':
+ drvdata.fn = optarg;
+ break;
case 'D':
debug.fn = optarg;
break;
@@ -691,6 +729,8 @@ int main(int argc, char *argv[])
return 1;
if (blkiomon_open_output(&binary))
return 1;
+ if (blkiomon_open_output(&drvdata))
+ return 1;
if (blkiomon_open_output(&debug))
return 1;
if (blkiomon_open_msg_q())