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