1e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat/*
2e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * blktrace output analysis: generate a timeline & gather statistics
3e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat *
4e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * (C) Copyright 2008 Hewlett-Packard Development Company, L.P.
5e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * 	Alan D. Brunelle <alan.brunelle@hp.com>
6e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat *
7e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat *  This program is free software; you can redistribute it and/or modify
8e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat *  it under the terms of the GNU General Public License as published by
9e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat *  the Free Software Foundation; either version 2 of the License, or
10e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat *  (at your option) any later version.
11e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat *
12e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat *  This program is distributed in the hope that it will be useful,
13e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat *  GNU General Public License for more details.
16e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat *
17e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat *  You should have received a copy of the GNU General Public License
18e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat *  along with this program; if not, write to the Free Software
19e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat *
21e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat */
22e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#include "globals.h"
23e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
24e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatstruct plat_info {
25e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	long nl;
26e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	FILE *fp;
27e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	double first_ts, last_ts, tl;
28e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat};
29e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
30e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatvoid *plat_alloc(char *str)
31e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{
32e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	char *oname;
33e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	struct plat_info *pp;
34e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
35e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	if (plat_freq <= 0.0) return NULL;
36e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
37e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	pp = malloc(sizeof(*pp));
38e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	pp->nl = 0;
39e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	pp->first_ts = pp->last_ts = pp->tl = -1.0;
40e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
41e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	oname = malloc(strlen(str) + 32);
42e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	sprintf(oname, "%s.dat", str);
43e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	if ((pp->fp = my_fopen(oname, "w")) == NULL) {
44e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		perror(oname);
45e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		return NULL;
46e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	}
47e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	add_file(pp->fp, oname);
48e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
49e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	return pp;
50e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat}
51e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
52e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatvoid plat_free(void *info)
53e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{
54e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	struct plat_info *pp = info;
55e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
56e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	if (pp == NULL) return;
57e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
58e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	if (pp->first_ts != -1.0) {
59e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		double delta = pp->last_ts - pp->first_ts;
60e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
61e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		fprintf(pp->fp, "%lf %lf\n",
62e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat			pp->first_ts + (delta / 2), pp->tl / pp->nl);
63e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	}
64e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	free(info);
65e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat}
66e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
67e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatvoid plat_x2c(void *info, __u64 ts, __u64 latency)
68e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{
69e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	double now = TO_SEC(ts);
70e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	double lat = TO_SEC(latency);
71e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	struct plat_info *pp = info;
72e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
73e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	if (pp == NULL) return;
74e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
75e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	if (pp->first_ts == -1.0) {
76e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		pp->first_ts = pp->last_ts = now;
77e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		pp->nl = 1;
78e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		pp->tl = lat;
79e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	} else if ((now - pp->first_ts) >= plat_freq) {
80e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		double delta = pp->last_ts - pp->first_ts;
81e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
82e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		fprintf(pp->fp, "%lf %lf\n",
83e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat			pp->first_ts + (delta / 2), pp->tl / pp->nl);
84e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
85e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		pp->first_ts = pp->last_ts = now;
86e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		pp->nl = 1;
87e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		pp->tl = lat;
88e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	} else {
89e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		pp->last_ts = now;
90e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		pp->nl += 1;
91e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		pp->tl += lat;
92e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	}
93e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat}
94