Commit | Line | Data |
---|---|---|
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 | 23 | static 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 |
38 | static 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 |
46 | static 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 | 57 | static 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 |
73 | void 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 | 82 | void 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 |
91 | void 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 |
100 | void 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 | } |