2 * ltt/probes/block-trace.c
4 * block layer tracepoint probes.
6 * (C) Copyright 2009 - Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
7 * Dual LGPL v2.1/GPL v2 license.
10 #include <linux/module.h>
12 #include <trace/events/block.h>
15 * Add rq cmd as a sequence. Needs new type. (size + binary blob)
18 void probe_block_rq_abort(void *data
, struct request_queue
*q
, struct request
*rq
)
20 int rw
= rq
->cmd_flags
& 0x03;
22 if (blk_discard_rq(rq
))
23 rw
|= (1 << BIO_RW_DISCARD
);
25 if (blk_pc_request(rq
)) {
26 trace_mark_tp(block
, rq_abort_pc
, block_rq_abort
,
28 "data_len %u rw %d errors %d",
29 blk_rq_bytes(rq
), rw
, rq
->errors
);
32 * FIXME Using a simple trace_mark for the second event
33 * possibility because tracepoints do not support multiple
34 * connections to the same probe yet. They should have some
35 * refcounting. Need to enable both rq_abort_pc and rq_abort_fs
36 * markers to have the rq_abort_fs marker enabled.
38 trace_mark(block
, rq_abort_fs
,
40 "rw %d errors %d", (unsigned long long)blk_rq_pos(rq
),
45 void probe_block_rq_insert(void *data
, struct request_queue
*q
, struct request
*rq
)
47 int rw
= rq
->cmd_flags
& 0x03;
49 if (blk_discard_rq(rq
))
50 rw
|= (1 << BIO_RW_DISCARD
);
52 if (blk_pc_request(rq
)) {
53 trace_mark_tp(block
, rq_insert_pc
, block_rq_insert
,
54 probe_block_rq_insert
,
55 "data_len %u rw %d errors %d",
56 blk_rq_bytes(rq
), rw
, rq
->errors
);
59 * FIXME Using a simple trace_mark for the second event
60 * possibility because tracepoints do not support multiple
61 * connections to the same probe yet. They should have some
62 * refcounting. Need to enable both rq_insert_pc and
63 * rq_insert_fs markers to have the rq_insert_fs marker enabled.
65 trace_mark(block
, rq_insert_fs
,
67 "rw %d errors %d", (unsigned long long)blk_rq_pos(rq
),
72 void probe_block_rq_issue(void *data
, struct request_queue
*q
, struct request
*rq
)
74 int rw
= rq
->cmd_flags
& 0x03;
76 if (blk_discard_rq(rq
))
77 rw
|= (1 << BIO_RW_DISCARD
);
79 if (blk_pc_request(rq
)) {
80 trace_mark_tp(block
, rq_issue_pc
, block_rq_issue
,
82 "data_len %u rw %d errors %d",
83 blk_rq_bytes(rq
), rw
, rq
->errors
);
86 * FIXME Using a simple trace_mark for the second event
87 * possibility because tracepoints do not support multiple
88 * connections to the same probe yet. They should have some
89 * refcounting. Need to enable both rq_issue_pc and rq_issue_fs
90 * markers to have the rq_issue_fs marker enabled.
92 trace_mark(block
, rq_issue_fs
,
94 "rw %d errors %d", (unsigned long long)blk_rq_pos(rq
),
99 void probe_block_rq_requeue(void *data
, struct request_queue
*q
, struct request
*rq
)
101 int rw
= rq
->cmd_flags
& 0x03;
103 if (blk_discard_rq(rq
))
104 rw
|= (1 << BIO_RW_DISCARD
);
106 if (blk_pc_request(rq
)) {
107 trace_mark_tp(block
, rq_requeue_pc
, block_rq_requeue
,
108 probe_block_rq_requeue
,
109 "data_len %u rw %d errors %d",
110 blk_rq_bytes(rq
), rw
, rq
->errors
);
113 * FIXME Using a simple trace_mark for the second event
114 * possibility because tracepoints do not support multiple
115 * connections to the same probe yet. They should have some
116 * refcounting. Need to enable both rq_requeue_pc and
117 * rq_requeue_fs markers to have the rq_requeue_fs marker
120 trace_mark(block
, rq_requeue_fs
,
122 "rw %d errors %d", (unsigned long long)blk_rq_pos(rq
),
127 void probe_block_rq_complete(void *data
, struct request_queue
*q
, struct request
*rq
)
129 int rw
= rq
->cmd_flags
& 0x03;
131 if (blk_discard_rq(rq
))
132 rw
|= (1 << BIO_RW_DISCARD
);
134 if (blk_pc_request(rq
)) {
135 trace_mark_tp(block
, rq_complete_pc
, block_rq_complete
,
136 probe_block_rq_complete
,
137 "data_len %u rw %d errors %d",
138 blk_rq_bytes(rq
), rw
, rq
->errors
);
141 * FIXME Using a simple trace_mark for the second event
142 * possibility because tracepoints do not support multiple
143 * connections to the same probe yet. They should have some
144 * refcounting. Need to enable both rq_complete_pc and
145 * rq_complete_fs markers to have the rq_complete_fs marker
148 trace_mark(block
, rq_complete_fs
,
150 "rw %d errors %d", (unsigned long long)blk_rq_pos(rq
),
155 void probe_block_bio_bounce(void *data
, struct request_queue
*q
, struct bio
*bio
)
157 trace_mark_tp(block
, bio_bounce
, block_bio_bounce
,
158 probe_block_bio_bounce
,
159 "sector %llu size %u rw(FAILFAST_DRIVER,FAILFAST_TRANSPORT,"
160 "FAILFAST_DEV,DISCARD,META,SYNC,BARRIER,AHEAD,RW) %lX "
161 "not_uptodate #1u%d",
162 (unsigned long long)bio
->bi_sector
, bio
->bi_size
,
163 bio
->bi_rw
, !bio_flagged(bio
, BIO_UPTODATE
));
166 void probe_block_bio_complete(void *data
, struct request_queue
*q
, struct bio
*bio
)
168 trace_mark_tp(block
, bio_complete
, block_bio_complete
,
169 probe_block_bio_complete
,
170 "sector %llu size %u rw(FAILFAST_DRIVER,FAILFAST_TRANSPORT,"
171 "FAILFAST_DEV,DISCARD,META,SYNC,BARRIER,AHEAD,RW) %lX "
172 "not_uptodate #1u%d",
173 (unsigned long long)bio
->bi_sector
, bio
->bi_size
,
174 bio
->bi_rw
, !bio_flagged(bio
, BIO_UPTODATE
));
177 void probe_block_bio_backmerge(void *data
, struct request_queue
*q
, struct bio
*bio
)
179 trace_mark_tp(block
, bio_backmerge
, block_bio_backmerge
,
180 probe_block_bio_backmerge
,
181 "sector %llu size %u rw(FAILFAST_DRIVER,FAILFAST_TRANSPORT,"
182 "FAILFAST_DEV,DISCARD,META,SYNC,BARRIER,AHEAD,RW) %lX "
183 "not_uptodate #1u%d",
184 (unsigned long long)bio
->bi_sector
, bio
->bi_size
,
185 bio
->bi_rw
, !bio_flagged(bio
, BIO_UPTODATE
));
188 void probe_block_bio_frontmerge(void *data
, struct request_queue
*q
, struct bio
*bio
)
190 trace_mark_tp(block
, bio_frontmerge
, block_bio_frontmerge
,
191 probe_block_bio_frontmerge
,
192 "sector %llu size %u rw(FAILFAST_DRIVER,FAILFAST_TRANSPORT,"
193 "FAILFAST_DEV,DISCARD,META,SYNC,BARRIER,AHEAD,RW) %lX "
194 "not_uptodate #1u%d",
195 (unsigned long long)bio
->bi_sector
, bio
->bi_size
,
196 bio
->bi_rw
, !bio_flagged(bio
, BIO_UPTODATE
));
199 void probe_block_bio_queue(void *data
, struct request_queue
*q
, struct bio
*bio
)
201 trace_mark_tp(block
, bio_queue
, block_bio_queue
,
202 probe_block_bio_queue
,
203 "sector %llu size %u rw(FAILFAST_DRIVER,FAILFAST_TRANSPORT,"
204 "FAILFAST_DEV,DISCARD,META,SYNC,BARRIER,AHEAD,RW) %lX "
205 "not_uptodate #1u%d",
206 (unsigned long long)bio
->bi_sector
, bio
->bi_size
,
207 bio
->bi_rw
, !bio_flagged(bio
, BIO_UPTODATE
));
210 void probe_block_getrq(void *data
, struct request_queue
*q
, struct bio
*bio
, int rw
)
213 trace_mark_tp(block
, getrq_bio
, block_getrq
,
215 "sector %llu size %u "
216 "rw(FAILFAST_DRIVER,FAILFAST_TRANSPORT,"
217 "FAILFAST_DEV,DISCARD,META,SYNC,BARRIER,AHEAD,RW) %lX "
218 "not_uptodate #1u%d",
219 (unsigned long long)bio
->bi_sector
, bio
->bi_size
,
220 bio
->bi_rw
, !bio_flagged(bio
, BIO_UPTODATE
));
223 * FIXME Using a simple trace_mark for the second event
224 * possibility because tracepoints do not support multiple
225 * connections to the same probe yet. They should have some
226 * refcounting. Need to enable both getrq_bio and getrq markers
227 * to have the getrq marker enabled.
229 trace_mark(block
, getrq
, "rw %d", rw
);
233 void probe_block_sleeprq(void *data
, struct request_queue
*q
, struct bio
*bio
, int rw
)
236 trace_mark_tp(block
, sleeprq_bio
, block_sleeprq
,
238 "sector %llu size %u "
239 "rw(FAILFAST_DRIVER,FAILFAST_TRANSPORT,"
240 "FAILFAST_DEV,DISCARD,META,SYNC,BARRIER,AHEAD,RW) %lX "
241 "not_uptodate #1u%d",
242 (unsigned long long)bio
->bi_sector
, bio
->bi_size
,
243 bio
->bi_rw
, !bio_flagged(bio
, BIO_UPTODATE
));
246 * FIXME Using a simple trace_mark for the second event
247 * possibility because tracepoints do not support multiple
248 * connections to the same probe yet. They should have some
249 * refcounting. Need to enable both sleeprq_bio and sleeprq
250 * markers to have the sleeprq marker enabled.
252 trace_mark(block
, sleeprq
, "rw %d", rw
);
256 void probe_block_plug(void *data
, struct request_queue
*q
)
258 trace_mark_tp(block
, plug
, block_plug
, probe_block_plug
,
262 void probe_block_unplug_io(void *data
, struct request_queue
*q
)
264 unsigned int pdu
= q
->rq
.count
[READ
] + q
->rq
.count
[WRITE
];
266 trace_mark_tp(block
, unplug_io
, block_unplug_io
, probe_block_unplug_io
,
270 void probe_block_unplug_timer(void *data
, struct request_queue
*q
)
272 unsigned int pdu
= q
->rq
.count
[READ
] + q
->rq
.count
[WRITE
];
274 trace_mark_tp(block
, unplug_timer
, block_unplug_timer
,
275 probe_block_unplug_timer
,
279 void probe_block_split(void *data
, struct request_queue
*q
, struct bio
*bio
,
282 trace_mark_tp(block
, split
, block_split
,
284 "sector %llu size %u rw(FAILFAST_DRIVER,FAILFAST_TRANSPORT,"
285 "FAILFAST_DEV,DISCARD,META,SYNC,BARRIER,AHEAD,RW) %lX "
286 "not_uptodate #1u%d pdu %u",
287 (unsigned long long)bio
->bi_sector
, bio
->bi_size
,
288 bio
->bi_rw
, !bio_flagged(bio
, BIO_UPTODATE
), pdu
);
291 void probe_block_remap(void *data
, struct request_queue
*q
, struct bio
*bio
,
292 dev_t dev
, sector_t from
)
294 trace_mark_tp(block
, remap
, block_remap
,
296 "device_from %lu sector_from %llu device_to %lu "
297 "size %u rw(FAILFAST_DRIVER,FAILFAST_TRANSPORT,"
298 "FAILFAST_DEV,DISCARD,META,SYNC,BARRIER,AHEAD,RW) %lX "
299 "not_uptodate #1u%d",
300 (unsigned long)bio
->bi_bdev
->bd_dev
,
301 (unsigned long long)from
,
303 bio
->bi_size
, bio
->bi_rw
,
304 !bio_flagged(bio
, BIO_UPTODATE
));
307 MODULE_LICENSE("GPL and additional rights");
308 MODULE_AUTHOR("Mathieu Desnoyers");
309 MODULE_DESCRIPTION("Block Tracepoint Probes");