xref: /aosp_15_r20/external/blktrace/btt/inlines.h (revision 1a3d31e37cc95e9919fd86900a2b6a555f55952c)
1*1a3d31e3SAndroid Build Coastguard Worker /*
2*1a3d31e3SAndroid Build Coastguard Worker  * blktrace output analysis: generate a timeline & gather statistics
3*1a3d31e3SAndroid Build Coastguard Worker  *
4*1a3d31e3SAndroid Build Coastguard Worker  * Copyright (C) 2006 Alan D. Brunelle <[email protected]>
5*1a3d31e3SAndroid Build Coastguard Worker  *
6*1a3d31e3SAndroid Build Coastguard Worker  *  This program is free software; you can redistribute it and/or modify
7*1a3d31e3SAndroid Build Coastguard Worker  *  it under the terms of the GNU General Public License as published by
8*1a3d31e3SAndroid Build Coastguard Worker  *  the Free Software Foundation; either version 2 of the License, or
9*1a3d31e3SAndroid Build Coastguard Worker  *  (at your option) any later version.
10*1a3d31e3SAndroid Build Coastguard Worker  *
11*1a3d31e3SAndroid Build Coastguard Worker  *  This program is distributed in the hope that it will be useful,
12*1a3d31e3SAndroid Build Coastguard Worker  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13*1a3d31e3SAndroid Build Coastguard Worker  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*1a3d31e3SAndroid Build Coastguard Worker  *  GNU General Public License for more details.
15*1a3d31e3SAndroid Build Coastguard Worker  *
16*1a3d31e3SAndroid Build Coastguard Worker  *  You should have received a copy of the GNU General Public License
17*1a3d31e3SAndroid Build Coastguard Worker  *  along with this program; if not, write to the Free Software
18*1a3d31e3SAndroid Build Coastguard Worker  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19*1a3d31e3SAndroid Build Coastguard Worker  *
20*1a3d31e3SAndroid Build Coastguard Worker  */
21*1a3d31e3SAndroid Build Coastguard Worker 
remapper_dev(__u32 dev)22*1a3d31e3SAndroid Build Coastguard Worker static inline int remapper_dev(__u32 dev)
23*1a3d31e3SAndroid Build Coastguard Worker {
24*1a3d31e3SAndroid Build Coastguard Worker 	int mjr = MAJOR(dev);
25*1a3d31e3SAndroid Build Coastguard Worker 	return mjr == 9 || mjr == 253 || mjr == 254;
26*1a3d31e3SAndroid Build Coastguard Worker }
27*1a3d31e3SAndroid Build Coastguard Worker 
region_init(struct region_info * reg)28*1a3d31e3SAndroid Build Coastguard Worker static inline void region_init(struct region_info *reg)
29*1a3d31e3SAndroid Build Coastguard Worker {
30*1a3d31e3SAndroid Build Coastguard Worker 	INIT_LIST_HEAD(&reg->qranges);
31*1a3d31e3SAndroid Build Coastguard Worker 	INIT_LIST_HEAD(&reg->cranges);
32*1a3d31e3SAndroid Build Coastguard Worker }
33*1a3d31e3SAndroid Build Coastguard Worker 
__region_exit(struct list_head * range_head)34*1a3d31e3SAndroid Build Coastguard Worker static inline void __region_exit(struct list_head *range_head)
35*1a3d31e3SAndroid Build Coastguard Worker {
36*1a3d31e3SAndroid Build Coastguard Worker 	struct list_head *p, *q;
37*1a3d31e3SAndroid Build Coastguard Worker 	struct range_info *rip;
38*1a3d31e3SAndroid Build Coastguard Worker 
39*1a3d31e3SAndroid Build Coastguard Worker 	list_for_each_safe(p, q, range_head) {
40*1a3d31e3SAndroid Build Coastguard Worker 		rip = list_entry(p, struct range_info, head);
41*1a3d31e3SAndroid Build Coastguard Worker 		free(rip);
42*1a3d31e3SAndroid Build Coastguard Worker 	}
43*1a3d31e3SAndroid Build Coastguard Worker }
44*1a3d31e3SAndroid Build Coastguard Worker 
region_exit(struct region_info * reg)45*1a3d31e3SAndroid Build Coastguard Worker static inline void region_exit(struct region_info *reg)
46*1a3d31e3SAndroid Build Coastguard Worker {
47*1a3d31e3SAndroid Build Coastguard Worker 	__region_exit(&reg->qranges);
48*1a3d31e3SAndroid Build Coastguard Worker 	__region_exit(&reg->cranges);
49*1a3d31e3SAndroid Build Coastguard Worker }
50*1a3d31e3SAndroid Build Coastguard Worker 
update_range(struct list_head * head_p,__u64 time)51*1a3d31e3SAndroid Build Coastguard Worker static inline void update_range(struct list_head *head_p, __u64 time)
52*1a3d31e3SAndroid Build Coastguard Worker {
53*1a3d31e3SAndroid Build Coastguard Worker 	struct range_info *rip;
54*1a3d31e3SAndroid Build Coastguard Worker 
55*1a3d31e3SAndroid Build Coastguard Worker 	if (!list_empty(head_p)) {
56*1a3d31e3SAndroid Build Coastguard Worker 		rip = list_entry(head_p->prev, struct range_info, head);
57*1a3d31e3SAndroid Build Coastguard Worker 
58*1a3d31e3SAndroid Build Coastguard Worker 		if (time < rip->end)
59*1a3d31e3SAndroid Build Coastguard Worker 			return;
60*1a3d31e3SAndroid Build Coastguard Worker 
61*1a3d31e3SAndroid Build Coastguard Worker 		if (BIT_TIME(time - rip->end) < range_delta) {
62*1a3d31e3SAndroid Build Coastguard Worker 			rip->end = time;
63*1a3d31e3SAndroid Build Coastguard Worker 			return;
64*1a3d31e3SAndroid Build Coastguard Worker 		}
65*1a3d31e3SAndroid Build Coastguard Worker 	}
66*1a3d31e3SAndroid Build Coastguard Worker 
67*1a3d31e3SAndroid Build Coastguard Worker 	rip = malloc(sizeof(*rip));
68*1a3d31e3SAndroid Build Coastguard Worker 	rip->start = rip->end = time;
69*1a3d31e3SAndroid Build Coastguard Worker 	list_add_tail(&rip->head, head_p);
70*1a3d31e3SAndroid Build Coastguard Worker }
71*1a3d31e3SAndroid Build Coastguard Worker 
update_qregion(struct region_info * reg,__u64 time)72*1a3d31e3SAndroid Build Coastguard Worker static inline void update_qregion(struct region_info *reg, __u64 time)
73*1a3d31e3SAndroid Build Coastguard Worker {
74*1a3d31e3SAndroid Build Coastguard Worker 	update_range(&reg->qranges, time);
75*1a3d31e3SAndroid Build Coastguard Worker }
76*1a3d31e3SAndroid Build Coastguard Worker 
update_cregion(struct region_info * reg,__u64 time)77*1a3d31e3SAndroid Build Coastguard Worker static inline void update_cregion(struct region_info *reg, __u64 time)
78*1a3d31e3SAndroid Build Coastguard Worker {
79*1a3d31e3SAndroid Build Coastguard Worker 	update_range(&reg->cranges, time);
80*1a3d31e3SAndroid Build Coastguard Worker }
81*1a3d31e3SAndroid Build Coastguard Worker 
avg_update(struct avg_info * ap,__u64 t)82*1a3d31e3SAndroid Build Coastguard Worker static inline void avg_update(struct avg_info *ap, __u64 t)
83*1a3d31e3SAndroid Build Coastguard Worker {
84*1a3d31e3SAndroid Build Coastguard Worker         if (ap->n++ == 0)
85*1a3d31e3SAndroid Build Coastguard Worker                 ap->min = ap->total = ap->max = t;
86*1a3d31e3SAndroid Build Coastguard Worker         else {
87*1a3d31e3SAndroid Build Coastguard Worker                 if (t < ap->min)
88*1a3d31e3SAndroid Build Coastguard Worker                         ap->min = t;
89*1a3d31e3SAndroid Build Coastguard Worker                 else if (t > ap->max)
90*1a3d31e3SAndroid Build Coastguard Worker                         ap->max = t;
91*1a3d31e3SAndroid Build Coastguard Worker                 ap->total += t;
92*1a3d31e3SAndroid Build Coastguard Worker         }
93*1a3d31e3SAndroid Build Coastguard Worker }
94*1a3d31e3SAndroid Build Coastguard Worker 
avg_update_n(struct avg_info * ap,__u64 t,int n)95*1a3d31e3SAndroid Build Coastguard Worker static inline void avg_update_n(struct avg_info *ap, __u64 t, int n)
96*1a3d31e3SAndroid Build Coastguard Worker {
97*1a3d31e3SAndroid Build Coastguard Worker         if (ap->n == 0) {
98*1a3d31e3SAndroid Build Coastguard Worker                 ap->min = ap->max = t;
99*1a3d31e3SAndroid Build Coastguard Worker 		ap->total = (n * t);
100*1a3d31e3SAndroid Build Coastguard Worker 	} else {
101*1a3d31e3SAndroid Build Coastguard Worker                 if (t < ap->min)
102*1a3d31e3SAndroid Build Coastguard Worker                         ap->min = t;
103*1a3d31e3SAndroid Build Coastguard Worker                 else if (t > ap->max)
104*1a3d31e3SAndroid Build Coastguard Worker                         ap->max = t;
105*1a3d31e3SAndroid Build Coastguard Worker                 ap->total += (n * t);
106*1a3d31e3SAndroid Build Coastguard Worker         }
107*1a3d31e3SAndroid Build Coastguard Worker 
108*1a3d31e3SAndroid Build Coastguard Worker 	ap->n += n;
109*1a3d31e3SAndroid Build Coastguard Worker }
110*1a3d31e3SAndroid Build Coastguard Worker 
avg_unupdate(struct avg_info * ap,__u64 t)111*1a3d31e3SAndroid Build Coastguard Worker static inline void avg_unupdate(struct avg_info *ap, __u64 t)
112*1a3d31e3SAndroid Build Coastguard Worker {
113*1a3d31e3SAndroid Build Coastguard Worker 	ap->n--;
114*1a3d31e3SAndroid Build Coastguard Worker 	ap->total -= t;
115*1a3d31e3SAndroid Build Coastguard Worker }
116*1a3d31e3SAndroid Build Coastguard Worker 
update_lq(__u64 * last_q,struct avg_info * avg,__u64 time)117*1a3d31e3SAndroid Build Coastguard Worker static inline void update_lq(__u64 *last_q, struct avg_info *avg, __u64 time)
118*1a3d31e3SAndroid Build Coastguard Worker {
119*1a3d31e3SAndroid Build Coastguard Worker 	if (*last_q != ((__u64)-1))
120*1a3d31e3SAndroid Build Coastguard Worker 		avg_update(avg, (time > *last_q) ? time - *last_q : 1);
121*1a3d31e3SAndroid Build Coastguard Worker 	*last_q = time;
122*1a3d31e3SAndroid Build Coastguard Worker }
123*1a3d31e3SAndroid Build Coastguard Worker 
dip_update_q(struct d_info * dip,struct io * iop)124*1a3d31e3SAndroid Build Coastguard Worker static inline void dip_update_q(struct d_info *dip, struct io *iop)
125*1a3d31e3SAndroid Build Coastguard Worker {
126*1a3d31e3SAndroid Build Coastguard Worker 	if (remapper_dev(dip->device))
127*1a3d31e3SAndroid Build Coastguard Worker 		update_lq(&dip->last_q, &dip->avgs.q2q_dm, iop->t.time);
128*1a3d31e3SAndroid Build Coastguard Worker 	else
129*1a3d31e3SAndroid Build Coastguard Worker 		update_lq(&dip->last_q, &dip->avgs.q2q, iop->t.time);
130*1a3d31e3SAndroid Build Coastguard Worker 	update_qregion(&dip->regions, iop->t.time);
131*1a3d31e3SAndroid Build Coastguard Worker }
132*1a3d31e3SAndroid Build Coastguard Worker 
io_alloc(void)133*1a3d31e3SAndroid Build Coastguard Worker static inline struct io *io_alloc(void)
134*1a3d31e3SAndroid Build Coastguard Worker {
135*1a3d31e3SAndroid Build Coastguard Worker 	struct io *iop = malloc(sizeof(*iop));
136*1a3d31e3SAndroid Build Coastguard Worker 
137*1a3d31e3SAndroid Build Coastguard Worker 	memset(iop, 0, sizeof(struct io));
138*1a3d31e3SAndroid Build Coastguard Worker 	list_add_tail(&iop->a_head, &all_ios);
139*1a3d31e3SAndroid Build Coastguard Worker 
140*1a3d31e3SAndroid Build Coastguard Worker 	return iop;
141*1a3d31e3SAndroid Build Coastguard Worker }
142*1a3d31e3SAndroid Build Coastguard Worker 
io_free(struct io * iop)143*1a3d31e3SAndroid Build Coastguard Worker static inline void io_free(struct io *iop)
144*1a3d31e3SAndroid Build Coastguard Worker {
145*1a3d31e3SAndroid Build Coastguard Worker 	list_del(&iop->a_head);
146*1a3d31e3SAndroid Build Coastguard Worker 	free(iop);
147*1a3d31e3SAndroid Build Coastguard Worker }
148*1a3d31e3SAndroid Build Coastguard Worker 
io_free_all(void)149*1a3d31e3SAndroid Build Coastguard Worker static inline void io_free_all(void)
150*1a3d31e3SAndroid Build Coastguard Worker {
151*1a3d31e3SAndroid Build Coastguard Worker 	struct io *iop;
152*1a3d31e3SAndroid Build Coastguard Worker 	struct list_head *p, *q;
153*1a3d31e3SAndroid Build Coastguard Worker 
154*1a3d31e3SAndroid Build Coastguard Worker 	list_for_each_safe(p, q, &all_ios) {
155*1a3d31e3SAndroid Build Coastguard Worker 		iop = list_entry(p, struct io, a_head);
156*1a3d31e3SAndroid Build Coastguard Worker 		free(iop);
157*1a3d31e3SAndroid Build Coastguard Worker 	}
158*1a3d31e3SAndroid Build Coastguard Worker }
159*1a3d31e3SAndroid Build Coastguard Worker 
io_setup(struct io * iop,enum iop_type type)160*1a3d31e3SAndroid Build Coastguard Worker static inline int io_setup(struct io *iop, enum iop_type type)
161*1a3d31e3SAndroid Build Coastguard Worker {
162*1a3d31e3SAndroid Build Coastguard Worker 	iop->type = type;
163*1a3d31e3SAndroid Build Coastguard Worker 	iop->dip = dip_alloc(iop->t.device, iop);
164*1a3d31e3SAndroid Build Coastguard Worker 	if (iop->linked) {
165*1a3d31e3SAndroid Build Coastguard Worker 		iop->pip = find_process(iop->t.pid, NULL);
166*1a3d31e3SAndroid Build Coastguard Worker 		iop->bytes_left = iop->t.bytes;
167*1a3d31e3SAndroid Build Coastguard Worker 	}
168*1a3d31e3SAndroid Build Coastguard Worker 
169*1a3d31e3SAndroid Build Coastguard Worker 	return iop->linked;
170*1a3d31e3SAndroid Build Coastguard Worker }
171*1a3d31e3SAndroid Build Coastguard Worker 
io_release(struct io * iop)172*1a3d31e3SAndroid Build Coastguard Worker static inline void io_release(struct io *iop)
173*1a3d31e3SAndroid Build Coastguard Worker {
174*1a3d31e3SAndroid Build Coastguard Worker 	if (iop->linked)
175*1a3d31e3SAndroid Build Coastguard Worker 		iop_rem_dip(iop);
176*1a3d31e3SAndroid Build Coastguard Worker 	if (iop->pdu)
177*1a3d31e3SAndroid Build Coastguard Worker 		free(iop->pdu);
178*1a3d31e3SAndroid Build Coastguard Worker 
179*1a3d31e3SAndroid Build Coastguard Worker 	io_free(iop);
180*1a3d31e3SAndroid Build Coastguard Worker }
181*1a3d31e3SAndroid Build Coastguard Worker 
182*1a3d31e3SAndroid Build Coastguard Worker #define UPDATE_AVGS(_avg, _iop, _pip, _time) do {			\
183*1a3d31e3SAndroid Build Coastguard Worker 		avg_update(&all_avgs. _avg , _time);			\
184*1a3d31e3SAndroid Build Coastguard Worker 		avg_update(&_iop->dip->avgs. _avg , _time);		\
185*1a3d31e3SAndroid Build Coastguard Worker 		if (_pip) avg_update(&_pip->avgs. _avg , _time);	\
186*1a3d31e3SAndroid Build Coastguard Worker 	} while (0)
187*1a3d31e3SAndroid Build Coastguard Worker 
188*1a3d31e3SAndroid Build Coastguard Worker #define UPDATE_AVGS_N(_avg, _iop, _pip, _time, _n) do {			\
189*1a3d31e3SAndroid Build Coastguard Worker 		avg_update_n(&all_avgs. _avg , _time, _n);		\
190*1a3d31e3SAndroid Build Coastguard Worker 		avg_update_n(&_iop->dip->avgs. _avg , _time, _n);	\
191*1a3d31e3SAndroid Build Coastguard Worker 		if (_pip) avg_update_n(&_pip->avgs. _avg , _time,_n);	\
192*1a3d31e3SAndroid Build Coastguard Worker 	} while (0)
193*1a3d31e3SAndroid Build Coastguard Worker 
194*1a3d31e3SAndroid Build Coastguard Worker #define UNUPDATE_AVGS(_avg, _iop, _pip, _time) do {			\
195*1a3d31e3SAndroid Build Coastguard Worker 		avg_unupdate(&all_avgs. _avg , _time);			\
196*1a3d31e3SAndroid Build Coastguard Worker 		avg_unupdate(&_iop->dip->avgs. _avg , _time);		\
197*1a3d31e3SAndroid Build Coastguard Worker 		if (_pip) avg_unupdate(&_pip->avgs. _avg , _time);	\
198*1a3d31e3SAndroid Build Coastguard Worker 	} while (0)
199*1a3d31e3SAndroid Build Coastguard Worker 
update_q2c(struct io * iop,__u64 c_time)200*1a3d31e3SAndroid Build Coastguard Worker static inline void update_q2c(struct io *iop, __u64 c_time)
201*1a3d31e3SAndroid Build Coastguard Worker {
202*1a3d31e3SAndroid Build Coastguard Worker 	if (remapper_dev(iop->dip->device))
203*1a3d31e3SAndroid Build Coastguard Worker 		UPDATE_AVGS(q2c_dm, iop, iop->pip, c_time);
204*1a3d31e3SAndroid Build Coastguard Worker 	else
205*1a3d31e3SAndroid Build Coastguard Worker 		UPDATE_AVGS(q2c, iop, iop->pip, c_time);
206*1a3d31e3SAndroid Build Coastguard Worker }
207*1a3d31e3SAndroid Build Coastguard Worker 
update_q2a(struct io * iop,__u64 a_time)208*1a3d31e3SAndroid Build Coastguard Worker static inline void update_q2a(struct io *iop, __u64 a_time)
209*1a3d31e3SAndroid Build Coastguard Worker {
210*1a3d31e3SAndroid Build Coastguard Worker 	if (remapper_dev(iop->dip->device))
211*1a3d31e3SAndroid Build Coastguard Worker 		UPDATE_AVGS(q2a_dm, iop, iop->pip, a_time);
212*1a3d31e3SAndroid Build Coastguard Worker 	else
213*1a3d31e3SAndroid Build Coastguard Worker 		UPDATE_AVGS(q2a, iop, iop->pip, a_time);
214*1a3d31e3SAndroid Build Coastguard Worker }
215*1a3d31e3SAndroid Build Coastguard Worker 
update_q2g(struct io * iop,__u64 g_time)216*1a3d31e3SAndroid Build Coastguard Worker static inline void update_q2g(struct io *iop, __u64 g_time)
217*1a3d31e3SAndroid Build Coastguard Worker {
218*1a3d31e3SAndroid Build Coastguard Worker 	UPDATE_AVGS(q2g, iop, iop->pip, g_time);
219*1a3d31e3SAndroid Build Coastguard Worker }
220*1a3d31e3SAndroid Build Coastguard Worker 
update_s2g(struct io * iop,__u64 g_time)221*1a3d31e3SAndroid Build Coastguard Worker static inline void update_s2g(struct io *iop, __u64 g_time)
222*1a3d31e3SAndroid Build Coastguard Worker {
223*1a3d31e3SAndroid Build Coastguard Worker 	UPDATE_AVGS(s2g, iop, iop->pip, g_time);
224*1a3d31e3SAndroid Build Coastguard Worker }
225*1a3d31e3SAndroid Build Coastguard Worker 
unupdate_q2g(struct io * iop,__u64 g_time)226*1a3d31e3SAndroid Build Coastguard Worker static inline void unupdate_q2g(struct io *iop, __u64 g_time)
227*1a3d31e3SAndroid Build Coastguard Worker {
228*1a3d31e3SAndroid Build Coastguard Worker 	UNUPDATE_AVGS(q2g, iop, iop->pip, g_time);
229*1a3d31e3SAndroid Build Coastguard Worker }
230*1a3d31e3SAndroid Build Coastguard Worker 
update_g2i(struct io * iop,__u64 i_time)231*1a3d31e3SAndroid Build Coastguard Worker static inline void update_g2i(struct io *iop, __u64 i_time)
232*1a3d31e3SAndroid Build Coastguard Worker {
233*1a3d31e3SAndroid Build Coastguard Worker 	UPDATE_AVGS(g2i, iop, iop->pip, i_time);
234*1a3d31e3SAndroid Build Coastguard Worker }
235*1a3d31e3SAndroid Build Coastguard Worker 
unupdate_g2i(struct io * iop,__u64 i_time)236*1a3d31e3SAndroid Build Coastguard Worker static inline void unupdate_g2i(struct io *iop, __u64 i_time)
237*1a3d31e3SAndroid Build Coastguard Worker {
238*1a3d31e3SAndroid Build Coastguard Worker 	UNUPDATE_AVGS(g2i, iop, iop->pip, i_time);
239*1a3d31e3SAndroid Build Coastguard Worker }
240*1a3d31e3SAndroid Build Coastguard Worker 
update_q2m(struct io * iop,__u64 m_time)241*1a3d31e3SAndroid Build Coastguard Worker static inline void update_q2m(struct io *iop, __u64 m_time)
242*1a3d31e3SAndroid Build Coastguard Worker {
243*1a3d31e3SAndroid Build Coastguard Worker 	UPDATE_AVGS(q2m, iop, iop->pip, m_time);
244*1a3d31e3SAndroid Build Coastguard Worker }
245*1a3d31e3SAndroid Build Coastguard Worker 
unupdate_q2m(struct io * iop,__u64 m_time)246*1a3d31e3SAndroid Build Coastguard Worker static inline void unupdate_q2m(struct io *iop, __u64 m_time)
247*1a3d31e3SAndroid Build Coastguard Worker {
248*1a3d31e3SAndroid Build Coastguard Worker 	UNUPDATE_AVGS(q2m, iop, iop->pip, m_time);
249*1a3d31e3SAndroid Build Coastguard Worker }
250*1a3d31e3SAndroid Build Coastguard Worker 
update_i2d(struct io * iop,__u64 d_time)251*1a3d31e3SAndroid Build Coastguard Worker static inline void update_i2d(struct io *iop, __u64 d_time)
252*1a3d31e3SAndroid Build Coastguard Worker {
253*1a3d31e3SAndroid Build Coastguard Worker 	UPDATE_AVGS(i2d, iop, iop->pip, d_time);
254*1a3d31e3SAndroid Build Coastguard Worker }
255*1a3d31e3SAndroid Build Coastguard Worker 
unupdate_i2d(struct io * iop,__u64 d_time)256*1a3d31e3SAndroid Build Coastguard Worker static inline void unupdate_i2d(struct io *iop, __u64 d_time)
257*1a3d31e3SAndroid Build Coastguard Worker {
258*1a3d31e3SAndroid Build Coastguard Worker 	UNUPDATE_AVGS(i2d, iop, iop->pip, d_time);
259*1a3d31e3SAndroid Build Coastguard Worker }
260*1a3d31e3SAndroid Build Coastguard Worker 
update_m2d(struct io * iop,__u64 d_time)261*1a3d31e3SAndroid Build Coastguard Worker static inline void update_m2d(struct io *iop, __u64 d_time)
262*1a3d31e3SAndroid Build Coastguard Worker {
263*1a3d31e3SAndroid Build Coastguard Worker 	UPDATE_AVGS(m2d, iop, iop->pip, d_time);
264*1a3d31e3SAndroid Build Coastguard Worker }
265*1a3d31e3SAndroid Build Coastguard Worker 
unupdate_m2d(struct io * iop,__u64 d_time)266*1a3d31e3SAndroid Build Coastguard Worker static inline void unupdate_m2d(struct io *iop, __u64 d_time)
267*1a3d31e3SAndroid Build Coastguard Worker {
268*1a3d31e3SAndroid Build Coastguard Worker 	UNUPDATE_AVGS(m2d, iop, iop->pip, d_time);
269*1a3d31e3SAndroid Build Coastguard Worker }
270*1a3d31e3SAndroid Build Coastguard Worker 
update_d2c(struct io * iop,__u64 c_time)271*1a3d31e3SAndroid Build Coastguard Worker static inline void update_d2c(struct io *iop, __u64 c_time)
272*1a3d31e3SAndroid Build Coastguard Worker {
273*1a3d31e3SAndroid Build Coastguard Worker 	UPDATE_AVGS(d2c, iop, iop->pip, c_time);
274*1a3d31e3SAndroid Build Coastguard Worker }
275*1a3d31e3SAndroid Build Coastguard Worker 
update_blks(struct io * iop)276*1a3d31e3SAndroid Build Coastguard Worker static inline void update_blks(struct io *iop)
277*1a3d31e3SAndroid Build Coastguard Worker {
278*1a3d31e3SAndroid Build Coastguard Worker 	__u64 nblks = iop->t.bytes >> 9;
279*1a3d31e3SAndroid Build Coastguard Worker 	avg_update(&all_avgs.blks, nblks);
280*1a3d31e3SAndroid Build Coastguard Worker 	avg_update(&iop->dip->avgs.blks, nblks);
281*1a3d31e3SAndroid Build Coastguard Worker 	if (iop->pip)
282*1a3d31e3SAndroid Build Coastguard Worker 		avg_update(&iop->pip->avgs.blks, nblks);
283*1a3d31e3SAndroid Build Coastguard Worker }
284*1a3d31e3SAndroid Build Coastguard Worker 
__get_root(struct d_info * dip,enum iop_type type)285*1a3d31e3SAndroid Build Coastguard Worker static inline struct rb_root *__get_root(struct d_info *dip, enum iop_type type)
286*1a3d31e3SAndroid Build Coastguard Worker {
287*1a3d31e3SAndroid Build Coastguard Worker 	struct rb_root *roots = dip->heads;
288*1a3d31e3SAndroid Build Coastguard Worker 	return &roots[type];
289*1a3d31e3SAndroid Build Coastguard Worker }
290*1a3d31e3SAndroid Build Coastguard Worker 
dip_rb_ins(struct d_info * dip,struct io * iop)291*1a3d31e3SAndroid Build Coastguard Worker static inline int dip_rb_ins(struct d_info *dip, struct io *iop)
292*1a3d31e3SAndroid Build Coastguard Worker {
293*1a3d31e3SAndroid Build Coastguard Worker 	return rb_insert(__get_root(dip, iop->type), iop);
294*1a3d31e3SAndroid Build Coastguard Worker }
295*1a3d31e3SAndroid Build Coastguard Worker 
dip_rb_rem(struct io * iop)296*1a3d31e3SAndroid Build Coastguard Worker static inline void dip_rb_rem(struct io *iop)
297*1a3d31e3SAndroid Build Coastguard Worker {
298*1a3d31e3SAndroid Build Coastguard Worker 	rb_erase(&iop->rb_node, __get_root(iop->dip, iop->type));
299*1a3d31e3SAndroid Build Coastguard Worker }
300*1a3d31e3SAndroid Build Coastguard Worker 
dip_rb_fe(struct d_info * dip,enum iop_type type,struct io * iop,void (* fnc)(struct io * iop,struct io * this),struct list_head * head)301*1a3d31e3SAndroid Build Coastguard Worker static inline void dip_rb_fe(struct d_info *dip, enum iop_type type,
302*1a3d31e3SAndroid Build Coastguard Worker 		             struct io *iop,
303*1a3d31e3SAndroid Build Coastguard Worker 			     void (*fnc)(struct io *iop, struct io *this),
304*1a3d31e3SAndroid Build Coastguard Worker 			     struct list_head *head)
305*1a3d31e3SAndroid Build Coastguard Worker {
306*1a3d31e3SAndroid Build Coastguard Worker 	rb_foreach(__get_root(dip, type)->rb_node, iop, fnc, head);
307*1a3d31e3SAndroid Build Coastguard Worker }
308*1a3d31e3SAndroid Build Coastguard Worker 
dip_rb_find_sec(struct d_info * dip,enum iop_type type,__u64 sec)309*1a3d31e3SAndroid Build Coastguard Worker static inline struct io *dip_rb_find_sec(struct d_info *dip,
310*1a3d31e3SAndroid Build Coastguard Worker 		                         enum iop_type type, __u64 sec)
311*1a3d31e3SAndroid Build Coastguard Worker {
312*1a3d31e3SAndroid Build Coastguard Worker 	return rb_find_sec(__get_root(dip, type), sec);
313*1a3d31e3SAndroid Build Coastguard Worker }
314*1a3d31e3SAndroid Build Coastguard Worker 
tdelta(__u64 from,__u64 to)315*1a3d31e3SAndroid Build Coastguard Worker static inline __u64 tdelta(__u64 from, __u64 to)
316*1a3d31e3SAndroid Build Coastguard Worker {
317*1a3d31e3SAndroid Build Coastguard Worker 	return (from < to) ? (to - from) : 1;
318*1a3d31e3SAndroid Build Coastguard Worker }
319*1a3d31e3SAndroid Build Coastguard Worker 
type2c(enum iop_type type)320*1a3d31e3SAndroid Build Coastguard Worker static inline int type2c(enum iop_type type)
321*1a3d31e3SAndroid Build Coastguard Worker {
322*1a3d31e3SAndroid Build Coastguard Worker 	int c;
323*1a3d31e3SAndroid Build Coastguard Worker 
324*1a3d31e3SAndroid Build Coastguard Worker 	switch (type) {
325*1a3d31e3SAndroid Build Coastguard Worker 	case IOP_Q: c = 'Q'; break;
326*1a3d31e3SAndroid Build Coastguard Worker 	case IOP_X: c = 'X'; break;
327*1a3d31e3SAndroid Build Coastguard Worker 	case IOP_A: c = 'A'; break;
328*1a3d31e3SAndroid Build Coastguard Worker 	case IOP_I: c = 'I'; break;
329*1a3d31e3SAndroid Build Coastguard Worker 	case IOP_M: c = 'M'; break;
330*1a3d31e3SAndroid Build Coastguard Worker 	case IOP_D: c = 'D'; break;
331*1a3d31e3SAndroid Build Coastguard Worker 	case IOP_C: c = 'C'; break;
332*1a3d31e3SAndroid Build Coastguard Worker 	case IOP_R: c = 'R'; break;
333*1a3d31e3SAndroid Build Coastguard Worker 	case IOP_G: c = 'G'; break;
334*1a3d31e3SAndroid Build Coastguard Worker 	default   : c = '?'; break;
335*1a3d31e3SAndroid Build Coastguard Worker 	}
336*1a3d31e3SAndroid Build Coastguard Worker 
337*1a3d31e3SAndroid Build Coastguard Worker 	return c;
338*1a3d31e3SAndroid Build Coastguard Worker }
339*1a3d31e3SAndroid Build Coastguard Worker 
histo_idx(__u64 nbytes)340*1a3d31e3SAndroid Build Coastguard Worker static inline int histo_idx(__u64 nbytes)
341*1a3d31e3SAndroid Build Coastguard Worker {
342*1a3d31e3SAndroid Build Coastguard Worker 	int idx = (nbytes >> 9) - 1;
343*1a3d31e3SAndroid Build Coastguard Worker 	return min(idx, N_HIST_BKTS-1);
344*1a3d31e3SAndroid Build Coastguard Worker }
345*1a3d31e3SAndroid Build Coastguard Worker 
update_q_histo(__u64 nbytes)346*1a3d31e3SAndroid Build Coastguard Worker static inline void update_q_histo(__u64 nbytes)
347*1a3d31e3SAndroid Build Coastguard Worker {
348*1a3d31e3SAndroid Build Coastguard Worker 	q_histo[histo_idx(nbytes)]++;
349*1a3d31e3SAndroid Build Coastguard Worker }
350*1a3d31e3SAndroid Build Coastguard Worker 
update_d_histo(__u64 nbytes)351*1a3d31e3SAndroid Build Coastguard Worker static inline void update_d_histo(__u64 nbytes)
352*1a3d31e3SAndroid Build Coastguard Worker {
353*1a3d31e3SAndroid Build Coastguard Worker 	d_histo[histo_idx(nbytes)]++;
354*1a3d31e3SAndroid Build Coastguard Worker }
355*1a3d31e3SAndroid Build Coastguard Worker 
io_first_list(struct list_head * head)356*1a3d31e3SAndroid Build Coastguard Worker static inline struct io *io_first_list(struct list_head *head)
357*1a3d31e3SAndroid Build Coastguard Worker {
358*1a3d31e3SAndroid Build Coastguard Worker 	if (list_empty(head))
359*1a3d31e3SAndroid Build Coastguard Worker 		return NULL;
360*1a3d31e3SAndroid Build Coastguard Worker 
361*1a3d31e3SAndroid Build Coastguard Worker 	return list_entry(head->next, struct io, f_head);
362*1a3d31e3SAndroid Build Coastguard Worker }
363*1a3d31e3SAndroid Build Coastguard Worker 
__dump_iop(FILE * ofp,struct io * iop,int extra_nl)364*1a3d31e3SAndroid Build Coastguard Worker static inline void __dump_iop(FILE *ofp, struct io *iop, int extra_nl)
365*1a3d31e3SAndroid Build Coastguard Worker {
366*1a3d31e3SAndroid Build Coastguard Worker 	fprintf(ofp, "%5d.%09lu %3d,%-3d %c %10llu+%-4u\n",
367*1a3d31e3SAndroid Build Coastguard Worker 		(int)SECONDS(iop->t.time),
368*1a3d31e3SAndroid Build Coastguard Worker 		(unsigned long)NANO_SECONDS(iop->t.time),
369*1a3d31e3SAndroid Build Coastguard Worker 		MAJOR(iop->t.device), MINOR(iop->t.device), type2c(iop->type),
370*1a3d31e3SAndroid Build Coastguard Worker 		(unsigned long long)iop->t.sector, t_sec(&iop->t));
371*1a3d31e3SAndroid Build Coastguard Worker 	if (extra_nl) fprintf(ofp, "\n");
372*1a3d31e3SAndroid Build Coastguard Worker }
373*1a3d31e3SAndroid Build Coastguard Worker 
__dump_iop2(FILE * ofp,struct io * a_iop,struct io * l_iop)374*1a3d31e3SAndroid Build Coastguard Worker static inline void __dump_iop2(FILE *ofp, struct io *a_iop, struct io *l_iop)
375*1a3d31e3SAndroid Build Coastguard Worker {
376*1a3d31e3SAndroid Build Coastguard Worker 	fprintf(ofp, "%5d.%09lu %3d,%-3d %c %10llu+%-4u <- (%3d,%-3d) %10llu\n",
377*1a3d31e3SAndroid Build Coastguard Worker 		(int)SECONDS(a_iop->t.time),
378*1a3d31e3SAndroid Build Coastguard Worker 		(unsigned long)NANO_SECONDS(a_iop->t.time),
379*1a3d31e3SAndroid Build Coastguard Worker 		MAJOR(a_iop->t.device), MINOR(a_iop->t.device),
380*1a3d31e3SAndroid Build Coastguard Worker 		type2c(a_iop->type), (unsigned long long)a_iop->t.sector,
381*1a3d31e3SAndroid Build Coastguard Worker 		t_sec(&a_iop->t), MAJOR(l_iop->t.device),
382*1a3d31e3SAndroid Build Coastguard Worker 		MINOR(l_iop->t.device), (unsigned long long)l_iop->t.sector);
383*1a3d31e3SAndroid Build Coastguard Worker }
384