1e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat/* 2e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * blktrace output analysis: generate a timeline & gather statistics 3e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * 4e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> 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 "globals.h" 22e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 23e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatstatic void __add_trace(struct io *iop) 24e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 25e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat time_t now = time(NULL); 26e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 27e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat n_traces++; 28e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat iostat_check_time(iop->t.time); 29e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 30e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (verbose && ((now - last_vtrace) > 0)) { 31e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat printf("%10lu t (%6.2lf%%)\r", n_traces, pct_done()); 32e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if ((n_traces % 1000000) == 0) printf("\n"); 33e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fflush(stdout); 34e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat last_vtrace = now; 35e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 36e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 37e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat switch (iop->t.action & 0xffff) { 38e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case __BLK_TA_QUEUE: trace_queue(iop); break; 39e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case __BLK_TA_REMAP: trace_remap(iop); break; 40e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case __BLK_TA_INSERT: trace_insert(iop); break; 41e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case __BLK_TA_GETRQ: trace_getrq(iop); break; 42e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case __BLK_TA_BACKMERGE: trace_merge(iop); break; 43e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case __BLK_TA_FRONTMERGE: trace_merge(iop); break; 44e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case __BLK_TA_REQUEUE: trace_requeue(iop); break; 45e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case __BLK_TA_ISSUE: trace_issue(iop); break; 46e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case __BLK_TA_COMPLETE: trace_complete(iop); break; 47e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case __BLK_TA_PLUG: trace_plug(iop); break; 48e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case __BLK_TA_UNPLUG_IO: trace_unplug_io(iop); break; 49e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case __BLK_TA_UNPLUG_TIMER: trace_unplug_timer(iop); break; 50e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case __BLK_TA_SLEEPRQ: trace_sleeprq(iop); break; 51e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat default: 52e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat io_release(iop); 53e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return; 54e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 55e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 56e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 57e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatstatic void trace_message(struct io *iop) 58e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 59e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat char scratch[15]; 60e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat char msg[iop->t.pdu_len + 1]; 61e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 62e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (!io_setup(iop, IOP_M)) 63e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return; 64e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 65e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat memcpy(msg, iop->pdu, iop->t.pdu_len); 66e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat msg[iop->t.pdu_len] = '\0'; 67e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 68e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(msgs_ofp, "%s %5d.%09lu %s\n", 69e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat make_dev_hdr(scratch, 15, iop->dip, 1), 70e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat (int)SECONDS(iop->t.time), 71e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat (unsigned long)NANO_SECONDS(iop->t.time), msg); 72e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 73e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 74e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatvoid add_trace(struct io *iop) 75e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 76e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (iop->t.action & BLK_TC_ACT(BLK_TC_NOTIFY)) { 77e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (iop->t.action == BLK_TN_PROCESS) { 78e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (iop->t.pid == 0) 79e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat process_alloc(0, "kernel"); 80e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat else { 81e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat char *slash = strchr(iop->pdu, '/'); 82e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (slash) 83e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat *slash = '\0'; 84e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 85e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat process_alloc(iop->t.pid, iop->pdu); 86e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 87e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } else if (iop->t.action == BLK_TN_MESSAGE) 88e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat trace_message(iop); 89e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat io_release(iop); 90e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } else if (iop->t.action & BLK_TC_ACT(BLK_TC_PC)) { 91e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat io_release(iop); 92e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } else { 93e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (time_bounded) { 94e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (BIT_TIME(iop->t.time) < t_astart) { 95e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat io_release(iop); 96e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return; 97e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } else if (BIT_TIME(iop->t.time) > t_aend) { 98e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat io_release(iop); 99e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat done = 1; 100e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return; 101e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 102e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 103e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __add_trace(iop); 104e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 105e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 106