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