1e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#ifndef BLKTRACE_H 2e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLKTRACE_H 3e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 4e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#include <stdio.h> 5e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#include <byteswap.h> 6e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#include <endian.h> 7e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 8e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#include "blktrace_api.h" 9e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#include "rbtree.h" 10e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 11e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define MINORBITS 20 12e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define MINORMASK ((1U << MINORBITS) - 1) 13e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS)) 14e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK)) 15e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 16e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define SECONDS(x) ((unsigned long long)(x) / 1000000000) 17e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define NANO_SECONDS(x) ((unsigned long long)(x) % 1000000000) 18e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define DOUBLE_TO_NANO_ULL(d) ((unsigned long long)((d) * 1000000000)) 19e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 20e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define min(a, b) ((a) < (b) ? (a) : (b)) 21e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define max(a, b) ((a) > (b) ? (a) : (b)) 22e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 23e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define t_sec(t) ((t)->bytes >> 9) 24e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define t_kb(t) ((t)->bytes >> 10) 25e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 26e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehattypedef __u32 u32; 27e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehattypedef __u8 u8; 28e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 29e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatstruct io_stats { 30e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat unsigned long qreads, qwrites, creads, cwrites, mreads, mwrites; 31e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat unsigned long ireads, iwrites, rrqueue, wrqueue; 32e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat unsigned long long qread_kb, qwrite_kb, cread_kb, cwrite_kb; 33e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat unsigned long long iread_kb, iwrite_kb; 34e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat unsigned long long mread_kb, mwrite_kb; 35e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat unsigned long qreads_pc, qwrites_pc, ireads_pc, iwrites_pc; 36e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat unsigned long rrqueue_pc, wrqueue_pc, creads_pc, cwrites_pc; 37e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat unsigned long long qread_kb_pc, qwrite_kb_pc, iread_kb_pc, iwrite_kb_pc; 38e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat unsigned long io_unplugs, timer_unplugs; 39e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat}; 40e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 41e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatstruct per_cpu_info { 42e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat unsigned int cpu; 43e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat unsigned int nelems; 44e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 45e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat int fd; 46e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat int fdblock; 47e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat char fname[128]; 48e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 49e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat struct io_stats io_stats; 50e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 51e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat struct rb_root rb_last; 52e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat unsigned long rb_last_entries; 53e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat unsigned long last_sequence; 54e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat unsigned long smallest_seq_read; 55e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 56e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat struct skip_info *skips_head; 57e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat struct skip_info *skips_tail; 58e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat}; 59e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 60e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatextern FILE *ofp; 61e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatextern int data_is_native; 62e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatextern struct timespec abs_start_time; 63e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 64e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define CHECK_MAGIC(t) (((t)->magic & 0xffffff00) == BLK_IO_TRACE_MAGIC) 65e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define SUPPORTED_VERSION (0x07) 66e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 67e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define __bswap_16 bswap_16 68e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define __bswap_32 bswap_32 69e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define __bswap_64 bswap_64 70e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 71e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#if __BYTE_ORDER == __LITTLE_ENDIAN 72e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define be16_to_cpu(x) __bswap_16(x) 73e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define be32_to_cpu(x) __bswap_32(x) 74e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define be64_to_cpu(x) __bswap_64(x) 75e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define cpu_to_be16(x) __bswap_16(x) 76e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define cpu_to_be32(x) __bswap_32(x) 77e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define cpu_to_be64(x) __bswap_64(x) 78e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#elif __BYTE_ORDER == __BIG_ENDIAN 79e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define be16_to_cpu(x) (x) 80e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define be32_to_cpu(x) (x) 81e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define be64_to_cpu(x) (x) 82e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define cpu_to_be16(x) (x) 83e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define cpu_to_be32(x) (x) 84e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define cpu_to_be64(x) (x) 85e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#else 86e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#error "Bad arch" 87e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#endif 88e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 89e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatstatic inline int verify_trace(struct blk_io_trace *t) 90e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 91e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (!CHECK_MAGIC(t)) { 92e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(stderr, "bad trace magic %x\n", t->magic); 93e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return 1; 94e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 95e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if ((t->magic & 0xff) != SUPPORTED_VERSION) { 96e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(stderr, "unsupported trace version %x\n", 97e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat t->magic & 0xff); 98e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return 1; 99e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 100e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 101e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return 0; 102e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 103e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 104e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatstatic inline void trace_to_cpu(struct blk_io_trace *t) 105e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 106e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (data_is_native) 107e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return; 108e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 109e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat t->magic = be32_to_cpu(t->magic); 110e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat t->sequence = be32_to_cpu(t->sequence); 111e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat t->time = be64_to_cpu(t->time); 112e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat t->sector = be64_to_cpu(t->sector); 113e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat t->bytes = be32_to_cpu(t->bytes); 114e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat t->action = be32_to_cpu(t->action); 115e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat t->pid = be32_to_cpu(t->pid); 116e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat t->device = be32_to_cpu(t->device); 117e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat t->cpu = be16_to_cpu(t->cpu); 118e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat t->error = be16_to_cpu(t->error); 119e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat t->pdu_len = be16_to_cpu(t->pdu_len); 120e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 121e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 122e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat/* 123e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * check whether data is native or not 124e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat */ 125e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatstatic inline int check_data_endianness(u32 magic) 126e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 127e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if ((magic & 0xffffff00) == BLK_IO_TRACE_MAGIC) { 128e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat data_is_native = 1; 129e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return 0; 130e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 131e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 132e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat magic = __bswap_32(magic); 133e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if ((magic & 0xffffff00) == BLK_IO_TRACE_MAGIC) { 134e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat data_is_native = 0; 135e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return 0; 136e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 137e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 138e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return 1; 139e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 140e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 141e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatextern void set_all_format_specs(char *); 142e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatextern int add_format_spec(char *); 143e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatextern void process_fmt(char *, struct per_cpu_info *, struct blk_io_trace *, 144e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat unsigned long long, int, unsigned char *); 145e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatextern int valid_act_opt(int); 146e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatextern int find_mask_map(char *); 147e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatextern char *find_process_name(pid_t); 148e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 149e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#endif 150