Factor out reading a single blk_io_trace event. This de-duplicates code and also prepares for expansion with new trace protocol versions. Signed-off-by: Johannes Thumshirn --- blkparse.c | 78 ++++++++++++++++++++++++------------------------------ 1 file changed, 34 insertions(+), 44 deletions(-) diff --git a/blkparse.c b/blkparse.c index 8381e20..5d5cd48 100644 --- a/blkparse.c +++ b/blkparse.c @@ -2428,6 +2428,34 @@ static inline __u32 get_magic(__u32 magic) return __bswap_32(magic); } +static int read_one_bit(int fd, struct blk_io_trace *bit, int block, + int *fdblock) +{ + int ret; + int pdu_len; + void *p = (void *) ((u8 *)bit + sizeof(__u32)); + + ret = read_data(fd, p, sizeof(*bit) - sizeof(__u32), block, fdblock); + if (ret) + return ret; + + pdu_len = get_pdulen(bit); + if (pdu_len) { + void *ptr = realloc(bit, sizeof(*bit) + pdu_len); + + ret = read_data(fd, ptr + sizeof(*bit), pdu_len, 1, fdblock); + if (ret) { + free(ptr); + return ret; + } + bit = ptr; + } + + trace_to_cpu(bit); + + return 0; +} + static int read_events(int fd, int always_block, int *fdblock) { struct per_dev_info *pdi = NULL; @@ -2436,9 +2464,8 @@ static int read_events(int fd, int always_block, int *fdblock) while (!is_done() && events < rb_batch) { struct blk_io_trace *bit; struct trace *t; - int pdu_len, should_block, ret; + int should_block, ret; __u32 magic; - void *p; should_block = !events || always_block; @@ -2465,33 +2492,14 @@ static int read_events(int fd, int always_block, int *fdblock) bit = bit_alloc(); bit->magic = magic; - p = (void *) ((u8 *)bit + sizeof(magic)); - ret = read_data(fd, p, sizeof(*bit) - sizeof(magic), - should_block, fdblock); - if (ret) { - bit_free(bit); - if (!events && ret < 0) - events = ret; + ret = read_one_bit(fd, bit, 1, fdblock); + if (ret) break; - } - - pdu_len = get_pdulen(bit); - if (pdu_len) { - void *ptr = realloc(bit, sizeof(*bit) + pdu_len); - - if (read_data(fd, ptr + sizeof(*bit), pdu_len, 1, fdblock)) { - bit_free(ptr); - break; - } - - bit = ptr; - } - - trace_to_cpu(bit); if (verify_trace(bit)) { bit_free(bit); + bit = NULL; continue; } @@ -2605,10 +2613,9 @@ static int ms_prime(struct ms_stream *msp) struct per_dev_info *pdi = msp->pdi; struct per_cpu_info *pci = get_cpu_info(pdi, msp->cpu); struct blk_io_trace *bit = NULL; - int ret, pdu_len, ndone = 0; + int ret, ndone = 0; for (i = 0; !is_done() && pci->fd >= 0 && i < rb_batch; i++) { - void *p; ret = read_data(pci->fd, &magic, sizeof(magic), 1, &pci->fdblock); @@ -2626,28 +2633,11 @@ static int ms_prime(struct ms_stream *msp) } bit = bit_alloc(); bit->magic = magic; - p = (void *) ((u8 *)bit + sizeof(magic)); - ret = read_data(pci->fd, p, sizeof(*bit) - sizeof(magic), 1, - &pci->fdblock); + ret = read_one_bit(pci->fd, bit, 1, &pci->fdblock); if (ret) goto err; - pdu_len = get_pdulen(bit); - if (pdu_len) { - void *ptr = realloc(bit, sizeof(*bit) + pdu_len); - ret = read_data(pci->fd, ptr + sizeof(*bit), pdu_len, - 1, &pci->fdblock); - if (ret) { - free(ptr); - bit = NULL; - goto err; - } - - bit = ptr; - } - - trace_to_cpu(bit); if (verify_trace(bit)) goto err; -- 2.51.0