1e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat/* 2e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * blktrace output analysis: generate a timeline & gather statistics 3e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * 4e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * (C) Copyright 2007 Hewlett-Packard Development Company, L.P. 5e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * 6e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * This program is free software; you can redistribute it and/or modify 7e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * it under the terms of the GNU General Public License as published by 8e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * the Free Software Foundation; either version 2 of the License, or 9e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * (at your option) any later version. 10e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * 11e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * This program is distributed in the hope that it will be useful, 12e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * but WITHOUT ANY WARRANTY; without even the implied warranty of 13e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * GNU General Public License for more details. 15e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * 16e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * You should have received a copy of the GNU General Public License 17e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * along with this program; if not, write to the Free Software 18e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * 20e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat */ 21e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#include <stdio.h> 22e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#include <stdlib.h> 23e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#include <string.h> 24e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 25e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#include "globals.h" 26e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 27e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define Q2D_MAX_HISTO 9 28e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatstruct q2d_info { 29e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat unsigned long nhistos; 30e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat unsigned long histos[Q2D_MAX_HISTO + 1]; 31e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat}; 32e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 33e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatvoid q2d_histo_add(void *priv, __u64 q2d_in) 34e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 35e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat int index; 36e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat struct q2d_info *q2dp = priv; 37e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat double q2d = BIT_TIME(q2d_in); 38e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat long msec = (long)(q2d / 0.001); 39e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 40e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat switch (msec) { 41e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat default: index = 9; break; 42e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 500 ... 999: index = 8; break; 43e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 250 ... 499: index = 7; break; 44e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 100 ... 249: index = 6; break; 45e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 75 ... 99: index = 5; break; 46e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 50 ... 74: index = 4; break; 47e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 25 ... 49: index = 3; break; 48e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 10 ... 24: index = 2; break; 49e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 5 ... 9: index = 1; break; 50e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 0 ... 4: index = 0; break; 51e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 52e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 53e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat q2dp->histos[index]++; 54e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat q2dp->nhistos++; 55e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 56e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 57e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatvoid *q2d_alloc(void) 58e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 59e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat struct q2d_info *q2dp = malloc(sizeof(*q2dp)); 60e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 61e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return memset(q2dp, 0, sizeof(*q2dp)); 62e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 63e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 64e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatvoid q2d_free(void *priv) 65e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 66e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat free(priv); 67e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 68e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 69e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatvoid q2d_display_header(FILE *fp) 70e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 71e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(fp, "%5s ", "<.005"); 72e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(fp, "%5s ", "<.010"); 73e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(fp, "%5s ", "<.025"); 74e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(fp, "%5s ", "<.050"); 75e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(fp, "%5s ", "<.075"); 76e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(fp, "%5s ", "<.100"); 77e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(fp, "%5s ", "<.250"); 78e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(fp, "%5s ", "<.500"); 79e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(fp, "%5s ", "< 1.0"); 80e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(fp, "%5s ", ">=1.0\n"); 81e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 82e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 83e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatvoid q2d_display_dashes(FILE *fp) 84e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 85e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat int i; 86e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 87e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat for (i = 0; i <= Q2D_MAX_HISTO; i++) 88e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(fp, "===== "); 89e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(fp, "\n"); 90e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 91e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 92e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatvoid q2d_display(FILE *fp, void *priv) 93e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 94e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat int i; 95e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat struct q2d_info *q2dp = priv; 96e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat double nh = (double)q2dp->nhistos; 97e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 98e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat for (i = 0; i <= Q2D_MAX_HISTO; i++) { 99e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat double p = 100.0 * (double)q2dp->histos[i] / nh; 100e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(fp, "%5.1lf ", p); 101e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 102e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(fp, "\n"); 103e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 104e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 105e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatint q2d_ok(void *priv) 106e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 107e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat struct q2d_info *q2dp = priv; 108e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 109e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return q2dp && q2dp->nhistos > 0; 110e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 111e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 112e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatvoid q2d_acc(void *a1, void *a2) 113e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 114e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat int i; 115e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat struct q2d_info *ap = a1; 116e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat struct q2d_info *tp = a2; 117e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 118e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat for (i = 0; i <= Q2D_MAX_HISTO; i++) 119e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat ap->histos[i] += tp->histos[i]; 120e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat ap->nhistos += tp->nhistos; 121e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 122