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