Skip unsupported protocol versions for now. Signed-off-by: Johannes Thumshirn --- blkparse.c | 136 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 76 insertions(+), 60 deletions(-) diff --git a/blkparse.c b/blkparse.c index 5d5cd48..0873c13 100644 --- a/blkparse.c +++ b/blkparse.c @@ -2462,10 +2462,10 @@ static int read_events(int fd, int always_block, int *fdblock) unsigned int events = 0; while (!is_done() && events < rb_batch) { - struct blk_io_trace *bit; struct trace *t; int should_block, ret; __u32 magic; + u8 version; should_block = !events || always_block; @@ -2489,42 +2489,50 @@ static int read_events(int fd, int always_block, int *fdblock) fprintf(stderr, "Bad magic %x\n", magic); break; } + version = magic & 0xff; + if (version == SUPPORTED_VERSION) { + struct blk_io_trace *bit; + bit = bit_alloc(); + bit->magic = magic; - bit = bit_alloc(); - bit->magic = magic; + ret = read_one_bit(fd, bit, 1, fdblock); + if (ret) + break; - ret = read_one_bit(fd, bit, 1, fdblock); - if (ret) - break; + /* + * not a real trace, so grab and handle it here + */ + if (bit->action & BLK_TC_ACT(BLK_TC_NOTIFY) && + (bit->action & ~__BLK_TN_CGROUP) != BLK_TN_MESSAGE) { + handle_notify(bit); + output_binary(bit, sizeof(*bit) + bit->pdu_len); + continue; + } - if (verify_trace(bit)) { - bit_free(bit); - bit = NULL; - continue; - } + if (verify_trace(bit)) { + bit_free(bit); + bit = NULL; + continue; + } - /* - * not a real trace, so grab and handle it here - */ - if (bit->action & BLK_TC_ACT(BLK_TC_NOTIFY) && (bit->action & ~__BLK_TN_CGROUP) != BLK_TN_MESSAGE) { - handle_notify(bit); - output_binary(bit, sizeof(*bit) + bit->pdu_len); - continue; - } + t = t_alloc(); + memset(t, 0, sizeof(*t)); + t->bit = bit; + t->read_sequence = read_sequence; - t = t_alloc(); - memset(t, 0, sizeof(*t)); - t->bit = bit; - t->read_sequence = read_sequence; + t->next = trace_list; + trace_list = t; - t->next = trace_list; - trace_list = t; + if (!pdi || pdi->dev != bit->device) + pdi = get_dev_info(bit->device); - if (!pdi || pdi->dev != bit->device) - pdi = get_dev_info(bit->device); + if (bit->time > pdi->last_read_time) + pdi->last_read_time = bit->time; + } else { + fprintf(stderr, "unsupported version %d\n", version); + continue; + } - if (bit->time > pdi->last_read_time) - pdi->last_read_time = bit->time; events++; } @@ -2616,6 +2624,7 @@ static int ms_prime(struct ms_stream *msp) int ret, ndone = 0; for (i = 0; !is_done() && pci->fd >= 0 && i < rb_batch; i++) { + u8 version; ret = read_data(pci->fd, &magic, sizeof(magic), 1, &pci->fdblock); @@ -2631,46 +2640,53 @@ static int ms_prime(struct ms_stream *msp) goto err; } - bit = bit_alloc(); - bit->magic = magic; + version = magic & 0xff; + if (version == SUPPORTED_VERSION) { + bit = bit_alloc(); + bit->magic = magic; - ret = read_one_bit(pci->fd, bit, 1, &pci->fdblock); - if (ret) - goto err; + ret = read_one_bit(pci->fd, bit, 1, &pci->fdblock); + if (ret) + goto err; - if (verify_trace(bit)) - goto err; + 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->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_CGROUP) != BLK_TN_MESSAGE) { - handle_notify(bit); - output_binary(bit, sizeof(*bit) + bit->pdu_len); - bit_free(bit); - bit = NULL; + if (bit->action & BLK_TC_ACT(BLK_TC_NOTIFY) && + (bit->action & ~__BLK_TN_CGROUP) != BLK_TN_MESSAGE) { + handle_notify(bit); + output_binary(bit, sizeof(*bit) + bit->pdu_len); + bit_free(bit); + bit = NULL; - i -= 1; - continue; - } + i -= 1; + continue; + } - if (bit->time > pdi->last_read_time) - pdi->last_read_time = bit->time; + if (bit->time > pdi->last_read_time) + pdi->last_read_time = bit->time; - t = t_alloc(); - memset(t, 0, sizeof(*t)); - t->bit = bit; + t = t_alloc(); + memset(t, 0, sizeof(*t)); + t->bit = bit; - if (msp->first == NULL) - msp->first = msp->last = t; - else { - msp->last->next = t; - msp->last = t; + if (msp->first == NULL) + msp->first = msp->last = t; + else { + msp->last->next = t; + msp->last = t; + } + } else { + fprintf(stderr, "unsupported version %d\n", version); + continue; } - ndone++; bit = NULL; } -- 2.51.0