blkparse: split off the timestamp correction code in to a separate function
[blktrace.git] / btt / trace_im.c
CommitLineData
095181f2
JA
1/*
2 * blktrace output analysis: generate a timeline & gather statistics
3 *
4 * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com>
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 "globals.h"
22
ae6d30f4 23static void handle_g(struct io *g_iop)
095181f2 24{
354db430 25 struct io *q_iop;
c8b0b334 26
ae6d30f4 27 iostat_getrq(g_iop);
354db430
AB
28
29 q_iop = dip_find_sec(g_iop->dip, IOP_Q, g_iop->t.sector);
ae6d30f4
AB
30 if (q_iop) {
31 q_iop->g_time = g_iop->t.time;
32 update_q2g(q_iop, tdelta(q_iop->t.time, g_iop->t.time));
354db430
AB
33 if (q_iop->s_time != 0)
34 update_s2g(q_iop, tdelta(q_iop->s_time, g_iop->t.time));
095181f2 35 }
ae6d30f4 36}
d76c5b81 37
354db430
AB
38static void handle_s(struct io *s_iop)
39{
40 struct io *q_iop = dip_find_sec(s_iop->dip, IOP_Q, s_iop->t.sector);
41
42 if (q_iop)
43 q_iop->s_time = s_iop->t.time;
44}
45
ae6d30f4
AB
46static void handle_i(struct io *i_iop)
47{
48 struct io *q_iop = dip_find_sec(i_iop->dip, IOP_Q, i_iop->t.sector);
095181f2 49
4c48f14e 50 if (q_iop) {
ae6d30f4
AB
51 q_iop->i_time = i_iop->t.time;
52 if (q_iop->g_time != (__u64)-1)
53 update_g2i(q_iop, tdelta(q_iop->g_time, i_iop->t.time));
4c48f14e 54 }
095181f2
JA
55}
56
ae6d30f4 57static void handle_m(struct io *m_iop)
095181f2 58{
354db430 59 struct io *q_iop;
d76c5b81 60
ae6d30f4 61 iostat_merge(m_iop);
354db430
AB
62
63 q_iop = dip_find_sec(m_iop->dip, IOP_Q, m_iop->t.sector);
ae6d30f4
AB
64 if (q_iop) {
65 q_iop->m_time = m_iop->t.time;
66 update_q2m(q_iop, tdelta(q_iop->t.time, m_iop->t.time));
67 }
461afe81
DB
68
69 if (m_iop->dip->n_act_q != 0)
70 m_iop->dip->n_act_q--;
095181f2
JA
71}
72
354db430
AB
73void trace_sleeprq(struct io *s_iop)
74{
75 if (s_iop->t.bytes == 0)
76 return;
77 if (io_setup(s_iop, IOP_S))
78 handle_s(s_iop);
79 io_release(s_iop);
80}
81
4c48f14e 82void trace_getrq(struct io *g_iop)
095181f2 83{
354db430
AB
84 if (g_iop->t.bytes == 0)
85 return;
4c48f14e 86 if (io_setup(g_iop, IOP_G))
ae6d30f4 87 handle_g(g_iop);
4c48f14e 88 io_release(g_iop);
d76c5b81 89}
095181f2 90
ae6d30f4
AB
91void trace_insert(struct io *i_iop)
92{
354db430
AB
93 if (i_iop->t.bytes == 0)
94 return;
ae6d30f4
AB
95 if (io_setup(i_iop, IOP_I))
96 handle_i(i_iop);
ae6d30f4
AB
97 io_release(i_iop);
98}
99
d76c5b81
AB
100void trace_merge(struct io *m_iop)
101{
354db430
AB
102 if (m_iop->t.bytes == 0)
103 return;
d76c5b81 104 if (io_setup(m_iop, IOP_M))
ae6d30f4 105 handle_m(m_iop);
4c48f14e 106 io_release(m_iop);
095181f2 107}