summaryrefslogtreecommitdiff
path: root/blkparse.c
diff options
context:
space:
mode:
authorAlan D. Brunelle <Alan.Brunelle@hp.com>2006-02-27 08:10:32 +0100
committerJens Axboe <axboe@suse.de>2006-02-27 08:10:32 +0100
commita2594911b74688e3b971526bbcad9e07db0c917c (patch)
tree77c97aa9643a621197d420f08bfa391ee240d3ab /blkparse.c
parentb2ecb3804b464b36e158f517d9a13abb0f1db9c6 (diff)
downloadblktrace-a2594911b74688e3b971526bbcad9e07db0c917c.tar.gz
blktrace-a2594911b74688e3b971526bbcad9e07db0c917c.tar.bz2
[PATCH] blkprase: binary dump capability + notify added
Here is a proposed patch which would allow blkparse to dump its output to a binary file (in addition to the ascii output). It adds a new '-d <file>' parameter. The purpose of this would be to allow for the easier handling of the collected data by analysis tools. [Rather than having to parse the textual output from blkparse, or duplicate the collation efforts of blkparse itself.]
Diffstat (limited to 'blkparse.c')
-rw-r--r--blkparse.c39
1 files changed, 38 insertions, 1 deletions
diff --git a/blkparse.c b/blkparse.c
index db553c7..75bc622 100644
--- a/blkparse.c
+++ b/blkparse.c
@@ -103,7 +103,7 @@ static struct per_process_info *ppi_hash_table[PPI_HASH_SIZE];
static struct per_process_info *ppi_list;
static int ppi_list_entries;
-#define S_OPTS "a:A:i:o:b:stqw:f:F:vVhD:"
+#define S_OPTS "a:A:i:o:b:stqw:f:F:vVhD:d:"
static struct option l_opts[] = {
{
.name = "act-mask",
@@ -196,6 +196,12 @@ static struct option l_opts[] = {
.val = 'D'
},
{
+ .name = "dump-binary",
+ .has_arg = required_argument,
+ .flag = NULL,
+ .val = 'd'
+ },
+ {
.name = NULL,
}
};
@@ -259,6 +265,9 @@ static unsigned int act_mask = -1U;
static int stats_printed;
int data_is_native = -1;
+static int dump_fd;
+static char *dump_binary;
+
static unsigned int t_alloc_cache;
static unsigned int bit_alloc_cache;
@@ -276,6 +285,18 @@ static volatile int done;
#define CPU_IDX(cpu) ((cpu) / CPUS_PER_LONG)
#define CPU_BIT(cpu) ((cpu) & (CPUS_PER_LONG - 1))
+static void output_binary(void *buf, int len)
+{
+ if (dump_binary) {
+ int n = write(dump_fd, buf, len);
+ if (n != len) {
+ perror(dump_binary);
+ close(dump_fd);
+ dump_binary = NULL;
+ }
+ }
+}
+
static void resize_cpu_info(struct per_dev_info *pdi, int cpu)
{
struct per_cpu_info *cpus = pdi->cpus;
@@ -1402,6 +1423,8 @@ static void dump_trace(struct blk_io_trace *t, struct per_cpu_info *pci,
pdi->first_reported_time = t->time;
pdi->events++;
+
+ output_binary(t, sizeof(*t) + t->pdu_len);
}
/*
@@ -1942,6 +1965,7 @@ static int read_events(int fd, int always_block, int *fdblock)
*/
if (bit->action & BLK_TC_ACT(BLK_TC_NOTIFY)) {
add_ppm_hash(bit->pid, (char *) bit + sizeof(*bit));
+ output_binary(bit, sizeof(*bit) + bit->pdu_len);
continue;
}
@@ -2175,6 +2199,7 @@ static char usage_str[] = \
"\t-i Input file containing trace data, or '-' for stdin\n" \
"\t-D Directory to prepend to input file names\n" \
"\t-o Output file. If not given, output is stdout\n" \
+ "\t-d Output file. If specified, binary data is written to file\n" \
"\t-b stdin read batching\n" \
"\t-s Show per-program io statistics\n" \
"\t-h Hash processes by name, not pid\n" \
@@ -2268,6 +2293,9 @@ int main(int argc, char *argv[])
case 'V':
printf("%s version %s\n", argv[0], blkparse_version);
return 0;
+ case 'd':
+ dump_binary = optarg;
+ break;
default:
usage(argv[0]);
return 1;
@@ -2320,6 +2348,15 @@ int main(int argc, char *argv[])
return 1;
}
+ if (dump_binary) {
+ dump_fd = creat(dump_binary, 0666);
+ if (dump_fd < 0) {
+ perror(dump_binary);
+ dump_binary = NULL;
+ return 1;
+ }
+ }
+
if (pipeline)
ret = do_stdin();
else