xref: /aosp_15_r20/external/blktrace/btt/q2d.c (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  * (C) Copyright 2007 Hewlett-Packard Development Company, L.P.
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 #include <stdio.h>
22*1a3d31e3SAndroid Build Coastguard Worker #include <stdlib.h>
23*1a3d31e3SAndroid Build Coastguard Worker #include <string.h>
24*1a3d31e3SAndroid Build Coastguard Worker 
25*1a3d31e3SAndroid Build Coastguard Worker #include "globals.h"
26*1a3d31e3SAndroid Build Coastguard Worker 
27*1a3d31e3SAndroid Build Coastguard Worker #define Q2D_MAX_HISTO 9
28*1a3d31e3SAndroid Build Coastguard Worker struct q2d_info {
29*1a3d31e3SAndroid Build Coastguard Worker 	unsigned long nhistos;
30*1a3d31e3SAndroid Build Coastguard Worker 	unsigned long histos[Q2D_MAX_HISTO + 1];
31*1a3d31e3SAndroid Build Coastguard Worker };
32*1a3d31e3SAndroid Build Coastguard Worker 
q2d_histo_add(void * priv,__u64 q2d_in)33*1a3d31e3SAndroid Build Coastguard Worker void q2d_histo_add(void *priv, __u64 q2d_in)
34*1a3d31e3SAndroid Build Coastguard Worker {
35*1a3d31e3SAndroid Build Coastguard Worker 	int index;
36*1a3d31e3SAndroid Build Coastguard Worker 	struct q2d_info *q2dp = priv;
37*1a3d31e3SAndroid Build Coastguard Worker 	double q2d = BIT_TIME(q2d_in);
38*1a3d31e3SAndroid Build Coastguard Worker 	long msec = (long)(q2d / 0.001);
39*1a3d31e3SAndroid Build Coastguard Worker 
40*1a3d31e3SAndroid Build Coastguard Worker 	switch (msec) {
41*1a3d31e3SAndroid Build Coastguard Worker 	default:          index = 9; break;
42*1a3d31e3SAndroid Build Coastguard Worker 	case 500 ... 999: index = 8; break;
43*1a3d31e3SAndroid Build Coastguard Worker 	case 250 ... 499: index = 7; break;
44*1a3d31e3SAndroid Build Coastguard Worker 	case 100 ... 249: index = 6; break;
45*1a3d31e3SAndroid Build Coastguard Worker 	case  75 ...  99: index = 5; break;
46*1a3d31e3SAndroid Build Coastguard Worker 	case  50 ...  74: index = 4; break;
47*1a3d31e3SAndroid Build Coastguard Worker 	case  25 ...  49: index = 3; break;
48*1a3d31e3SAndroid Build Coastguard Worker 	case  10 ...  24: index = 2; break;
49*1a3d31e3SAndroid Build Coastguard Worker 	case   5 ...   9: index = 1; break;
50*1a3d31e3SAndroid Build Coastguard Worker 	case   0 ...   4: index = 0; break;
51*1a3d31e3SAndroid Build Coastguard Worker 	}
52*1a3d31e3SAndroid Build Coastguard Worker 
53*1a3d31e3SAndroid Build Coastguard Worker 	q2dp->histos[index]++;
54*1a3d31e3SAndroid Build Coastguard Worker 	q2dp->nhistos++;
55*1a3d31e3SAndroid Build Coastguard Worker }
56*1a3d31e3SAndroid Build Coastguard Worker 
q2d_alloc(void)57*1a3d31e3SAndroid Build Coastguard Worker void *q2d_alloc(void)
58*1a3d31e3SAndroid Build Coastguard Worker {
59*1a3d31e3SAndroid Build Coastguard Worker 	struct q2d_info *q2dp = malloc(sizeof(*q2dp));
60*1a3d31e3SAndroid Build Coastguard Worker 
61*1a3d31e3SAndroid Build Coastguard Worker 	return memset(q2dp, 0, sizeof(*q2dp));
62*1a3d31e3SAndroid Build Coastguard Worker }
63*1a3d31e3SAndroid Build Coastguard Worker 
q2d_free(void * priv)64*1a3d31e3SAndroid Build Coastguard Worker void q2d_free(void *priv)
65*1a3d31e3SAndroid Build Coastguard Worker {
66*1a3d31e3SAndroid Build Coastguard Worker 	free(priv);
67*1a3d31e3SAndroid Build Coastguard Worker }
68*1a3d31e3SAndroid Build Coastguard Worker 
q2d_display_header(FILE * fp)69*1a3d31e3SAndroid Build Coastguard Worker void q2d_display_header(FILE *fp)
70*1a3d31e3SAndroid Build Coastguard Worker {
71*1a3d31e3SAndroid Build Coastguard Worker 	fprintf(fp, "%5s ", "<.005");
72*1a3d31e3SAndroid Build Coastguard Worker 	fprintf(fp, "%5s ", "<.010");
73*1a3d31e3SAndroid Build Coastguard Worker 	fprintf(fp, "%5s ", "<.025");
74*1a3d31e3SAndroid Build Coastguard Worker 	fprintf(fp, "%5s ", "<.050");
75*1a3d31e3SAndroid Build Coastguard Worker 	fprintf(fp, "%5s ", "<.075");
76*1a3d31e3SAndroid Build Coastguard Worker 	fprintf(fp, "%5s ", "<.100");
77*1a3d31e3SAndroid Build Coastguard Worker 	fprintf(fp, "%5s ", "<.250");
78*1a3d31e3SAndroid Build Coastguard Worker 	fprintf(fp, "%5s ", "<.500");
79*1a3d31e3SAndroid Build Coastguard Worker 	fprintf(fp, "%5s ", "< 1.0");
80*1a3d31e3SAndroid Build Coastguard Worker 	fprintf(fp, "%5s ", ">=1.0\n");
81*1a3d31e3SAndroid Build Coastguard Worker }
82*1a3d31e3SAndroid Build Coastguard Worker 
q2d_display_dashes(FILE * fp)83*1a3d31e3SAndroid Build Coastguard Worker void q2d_display_dashes(FILE *fp)
84*1a3d31e3SAndroid Build Coastguard Worker {
85*1a3d31e3SAndroid Build Coastguard Worker 	int i;
86*1a3d31e3SAndroid Build Coastguard Worker 
87*1a3d31e3SAndroid Build Coastguard Worker 	for (i = 0; i <= Q2D_MAX_HISTO; i++)
88*1a3d31e3SAndroid Build Coastguard Worker 		fprintf(fp, "===== ");
89*1a3d31e3SAndroid Build Coastguard Worker 	fprintf(fp, "\n");
90*1a3d31e3SAndroid Build Coastguard Worker }
91*1a3d31e3SAndroid Build Coastguard Worker 
q2d_display(FILE * fp,void * priv)92*1a3d31e3SAndroid Build Coastguard Worker void q2d_display(FILE *fp, void *priv)
93*1a3d31e3SAndroid Build Coastguard Worker {
94*1a3d31e3SAndroid Build Coastguard Worker 	int i;
95*1a3d31e3SAndroid Build Coastguard Worker 	struct q2d_info *q2dp = priv;
96*1a3d31e3SAndroid Build Coastguard Worker 	double nh = (double)q2dp->nhistos;
97*1a3d31e3SAndroid Build Coastguard Worker 
98*1a3d31e3SAndroid Build Coastguard Worker 	for (i = 0; i <= Q2D_MAX_HISTO; i++) {
99*1a3d31e3SAndroid Build Coastguard Worker 		double p = 100.0 * (double)q2dp->histos[i] / nh;
100*1a3d31e3SAndroid Build Coastguard Worker 		fprintf(fp, "%5.1lf ", p);
101*1a3d31e3SAndroid Build Coastguard Worker 	}
102*1a3d31e3SAndroid Build Coastguard Worker 	fprintf(fp, "\n");
103*1a3d31e3SAndroid Build Coastguard Worker }
104*1a3d31e3SAndroid Build Coastguard Worker 
q2d_ok(void * priv)105*1a3d31e3SAndroid Build Coastguard Worker int q2d_ok(void *priv)
106*1a3d31e3SAndroid Build Coastguard Worker {
107*1a3d31e3SAndroid Build Coastguard Worker 	struct q2d_info *q2dp = priv;
108*1a3d31e3SAndroid Build Coastguard Worker 
109*1a3d31e3SAndroid Build Coastguard Worker 	return q2dp && q2dp->nhistos > 0;
110*1a3d31e3SAndroid Build Coastguard Worker }
111*1a3d31e3SAndroid Build Coastguard Worker 
q2d_acc(void * a1,void * a2)112*1a3d31e3SAndroid Build Coastguard Worker void q2d_acc(void *a1, void *a2)
113*1a3d31e3SAndroid Build Coastguard Worker {
114*1a3d31e3SAndroid Build Coastguard Worker 	int i;
115*1a3d31e3SAndroid Build Coastguard Worker 	struct q2d_info *ap = a1;
116*1a3d31e3SAndroid Build Coastguard Worker 	struct q2d_info *tp = a2;
117*1a3d31e3SAndroid Build Coastguard Worker 
118*1a3d31e3SAndroid Build Coastguard Worker 	for (i = 0; i <= Q2D_MAX_HISTO; i++)
119*1a3d31e3SAndroid Build Coastguard Worker 		ap->histos[i] += tp->histos[i];
120*1a3d31e3SAndroid Build Coastguard Worker 	ap->nhistos += tp->nhistos;
121*1a3d31e3SAndroid Build Coastguard Worker }
122