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