#include "rbtree.h"
#include "jhash.h"
-static char blkparse_version[] = "1.0.0";
+static char blkparse_version[] = "1.0.4";
struct skip_info {
unsigned long start, end;
static struct per_process_info *ppi_list;
static int ppi_list_entries;
-#define S_OPTS "a:A:b:D:d:f:F:hi:o:Oqstw:vV"
static struct option l_opts[] = {
{
.name = "act-mask",
.flag = NULL,
.val = 'i'
},
+ {
+ .name = "no-msgs",
+ .has_arg = no_argument,
+ .flag = NULL,
+ .val = 'M'
+ },
{
.name = "output",
.has_arg = required_argument,
static int verbose;
static unsigned int act_mask = -1U;
static int stats_printed;
+static int bin_output_msgs = 1;
int data_is_native = -1;
static FILE *dump_fp;
ppm = malloc(sizeof(*ppm));
memset(ppm, 0, sizeof(*ppm));
ppm->pid = pid;
- strcpy(ppm->comm, name);
+ memset(ppm->comm, 0, sizeof(ppm->comm));
+ strncpy(ppm->comm, name, sizeof(ppm->comm));
+ ppm->comm[sizeof(ppm->comm) - 1] = '\0';
ppm->hash_next = ppm_hash_table[hash_idx];
ppm_hash_table[hash_idx] = ppm;
}
pdi->events++;
- output_binary(t, sizeof(*t) + t->pdu_len);
+ if (bin_output_msgs ||
+ !(t->action & BLK_TC_ACT(BLK_TC_NOTIFY) &&
+ t->action == BLK_TN_MESSAGE))
+ output_binary(t, sizeof(*t) + t->pdu_len);
}
/*
fprintf(ofp, " PC Reads Req.: %s\t\t", size_cnv(x, ios->rrqueue_pc, 0));
fprintf(ofp, " PC Writes Req.: %s\n", size_cnv(x, ios->wrqueue_pc, 0));
fprintf(ofp, " PC Reads Compl.: %s\t\t", size_cnv(x, ios->creads_pc, 0));
- fprintf(ofp, " PC Writes Compl.: %s\n", size_cnv(x, ios->cwrites, 0));
+ fprintf(ofp, " PC Writes Compl.: %s\n", size_cnv(x, ios->cwrites_pc, 0));
}
fprintf(ofp, " IO unplugs: %'8lu%8c\t", ios->io_unplugs, ' ');
fprintf(ofp, " Timer unplugs: %'8lu\n", ios->timer_unplugs);
* create a map of the cpus we have traces for
*/
cpu_map = malloc(pdi->cpu_map_max / sizeof(long));
+ memset(cpu_map, 0, sizeof(*cpu_map));
n = rb_first(&rb_sort_root);
while (n) {
__t = rb_entry(n, struct trace, rb_node);
break;
}
- if (check_sequence(pdi, t, force))
+ if (!(bit->action == BLK_TN_MESSAGE) &&
+ check_sequence(pdi, t, force))
break;
if (!force && bit->time > last_allowed_time)
if (!pci || pci->cpu != bit->cpu)
pci = get_cpu_info(pdi, bit->cpu);
- pci->last_sequence = bit->sequence;
+ if (!(bit->action == BLK_TN_MESSAGE))
+ pci->last_sequence = bit->sequence;
pci->nelems++;
if (verify_trace(bit))
goto err;
+ if (bit->cpu != pci->cpu) {
+ fprintf(stderr, "cpu %d trace info has error cpu %d\n",
+ pci->cpu, bit->cpu);
+ continue;
+ }
+
if (bit->action & BLK_TC_ACT(BLK_TC_NOTIFY) && bit->action != BLK_TN_MESSAGE) {
handle_notify(bit);
output_binary(bit, sizeof(*bit) + bit->pdu_len);
for (cpu = 0; setup_file(pdi, cpu); cpu++)
;
+
+ if (!cpu) {
+ fprintf(stderr,"No input files found for %s\n",
+ pdi->name);
+ return 1;
+ }
}
/*
return 0;
}
-#define S_OPTS "a:A:b:D:d:f:F:hi:o:Oqstw:vV"
+#define S_OPTS "a:A:b:D:d:f:F:hi:o:Oqstw:vVM"
static char usage_str[] = "\n\n" \
"-i <file> | --input=<file>\n" \
"[ -a <action field> | --act-mask=<action field> ]\n" \
"[ -s | --per-program-stats ]\n" \
"[ -t | --track-ios ]\n" \
"[ -w <time> | --stopwatch=<time> ]\n" \
+ "[ -M | --no-msgs\n" \
"[ -v | --verbose ]\n" \
"[ -V | --version ]\n\n" \
+ "\t-a Only trace specified actions. See documentation\n" \
+ "\t-A Give trace mask as a single value. See documentation\n" \
"\t-b stdin read batching\n" \
"\t-d Output file. If specified, binary data is written to file\n" \
"\t-D Directory to prepend to input file names\n" \
"\t to get queued, to get dispatched, and to get completed\n" \
"\t-w Only parse data between the given time interval in seconds.\n" \
"\t If 'start' isn't given, blkparse defaults the start time to 0\n" \
+ "\t-M Do not output messages to binary file\n" \
"\t-v More verbose for marginal errors\n" \
"\t-V Print program version info\n\n";
static void usage(char *prog)
{
- fprintf(stderr, "Usage: %s %s %s", prog, blkparse_version, usage_str);
+ fprintf(stderr, "Usage: %s %s", prog, usage_str);
}
int main(int argc, char *argv[])
case 'd':
dump_binary = optarg;
break;
+ case 'M':
+ bin_output_msgs = 0;
+ break;
default:
usage(argv[0]);
return 1;
}
if (dump_binary) {
- dump_fp = fopen(dump_binary, "w");
- if (!dump_fp) {
- perror(dump_binary);
- dump_binary = NULL;
- return 1;
+ if (!strcmp(dump_binary, "-"))
+ dump_fp = stdout;
+ else {
+ dump_fp = fopen(dump_binary, "w");
+ if (!dump_fp) {
+ perror(dump_binary);
+ dump_binary = NULL;
+ return 1;
+ }
}
bin_ofp_buffer = malloc(128 * 1024);
if (setvbuf(dump_fp, bin_ofp_buffer, _IOFBF, 128 * 1024)) {