aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorKent Overstreet <koverstreet@google.com>2013-04-26 18:39:55 -0400
committerKent Overstreet <koverstreet@google.com>2013-06-26 20:09:15 -0400
commitc37511b863f36c1cc6e18440717fd4cc0e881b8a (patch)
tree64d82c648bd092f38c35c4b808411bc1cdb3a9f0 /include
parent5794351146199b9ac67a5ab1beab82be8bfd7b5d (diff)
bcache: Fix/revamp tracepoints
The tracepoints were reworked to be more sensible, and fixed a null pointer deref in one of the tracepoints. Converted some of the pr_debug()s to tracepoints - this is partly a performance optimization; it used to be that with DEBUG or CONFIG_DYNAMIC_DEBUG pr_debug() was an empty macro; but at some point it was changed to an empty inline function. Some of the pr_debug() statements had rather expensive function calls as part of the arguments, so this code was getting run unnecessarily even on non debug kernels - in some fast paths, too. Signed-off-by: Kent Overstreet <koverstreet@google.com>
Diffstat (limited to 'include')
-rw-r--r--include/trace/events/bcache.h352
1 files changed, 241 insertions, 111 deletions
diff --git a/include/trace/events/bcache.h b/include/trace/events/bcache.h
index 3cc5a0b278c3..c9952b36fcea 100644
--- a/include/trace/events/bcache.h
+++ b/include/trace/events/bcache.h
@@ -9,9 +9,7 @@
9struct search; 9struct search;
10 10
11DECLARE_EVENT_CLASS(bcache_request, 11DECLARE_EVENT_CLASS(bcache_request,
12
13 TP_PROTO(struct search *s, struct bio *bio), 12 TP_PROTO(struct search *s, struct bio *bio),
14
15 TP_ARGS(s, bio), 13 TP_ARGS(s, bio),
16 14
17 TP_STRUCT__entry( 15 TP_STRUCT__entry(
@@ -22,7 +20,6 @@ DECLARE_EVENT_CLASS(bcache_request,
22 __field(dev_t, orig_sector ) 20 __field(dev_t, orig_sector )
23 __field(unsigned int, nr_sector ) 21 __field(unsigned int, nr_sector )
24 __array(char, rwbs, 6 ) 22 __array(char, rwbs, 6 )
25 __array(char, comm, TASK_COMM_LEN )
26 ), 23 ),
27 24
28 TP_fast_assign( 25 TP_fast_assign(
@@ -33,36 +30,66 @@ DECLARE_EVENT_CLASS(bcache_request,
33 __entry->orig_sector = bio->bi_sector - 16; 30 __entry->orig_sector = bio->bi_sector - 16;
34 __entry->nr_sector = bio->bi_size >> 9; 31 __entry->nr_sector = bio->bi_size >> 9;
35 blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_size); 32 blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_size);
36 memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
37 ), 33 ),
38 34
39 TP_printk("%d,%d %s %llu + %u [%s] (from %d,%d @ %llu)", 35 TP_printk("%d,%d %s %llu + %u (from %d,%d @ %llu)",
40 MAJOR(__entry->dev), MINOR(__entry->dev), 36 MAJOR(__entry->dev), MINOR(__entry->dev),
41 __entry->rwbs, 37 __entry->rwbs, (unsigned long long)__entry->sector,
42 (unsigned long long)__entry->sector, 38 __entry->nr_sector, __entry->orig_major, __entry->orig_minor,
43 __entry->nr_sector, __entry->comm,
44 __entry->orig_major, __entry->orig_minor,
45 (unsigned long long)__entry->orig_sector) 39 (unsigned long long)__entry->orig_sector)
46); 40);
47 41
48DEFINE_EVENT(bcache_request, bcache_request_start, 42DECLARE_EVENT_CLASS(bkey,
43 TP_PROTO(struct bkey *k),
44 TP_ARGS(k),
49 45
50 TP_PROTO(struct search *s, struct bio *bio), 46 TP_STRUCT__entry(
47 __field(u32, size )
48 __field(u32, inode )
49 __field(u64, offset )
50 __field(bool, dirty )
51 ),
51 52
52 TP_ARGS(s, bio) 53 TP_fast_assign(
54 __entry->inode = KEY_INODE(k);
55 __entry->offset = KEY_OFFSET(k);
56 __entry->size = KEY_SIZE(k);
57 __entry->dirty = KEY_DIRTY(k);
58 ),
59
60 TP_printk("%u:%llu len %u dirty %u", __entry->inode,
61 __entry->offset, __entry->size, __entry->dirty)
53); 62);
54 63
55DEFINE_EVENT(bcache_request, bcache_request_end, 64DECLARE_EVENT_CLASS(btree_node,
65 TP_PROTO(struct btree *b),
66 TP_ARGS(b),
67
68 TP_STRUCT__entry(
69 __field(size_t, bucket )
70 ),
71
72 TP_fast_assign(
73 __entry->bucket = PTR_BUCKET_NR(b->c, &b->key, 0);
74 ),
56 75
76 TP_printk("bucket %zu", __entry->bucket)
77);
78
79/* request.c */
80
81DEFINE_EVENT(bcache_request, bcache_request_start,
57 TP_PROTO(struct search *s, struct bio *bio), 82 TP_PROTO(struct search *s, struct bio *bio),
83 TP_ARGS(s, bio)
84);
58 85
86DEFINE_EVENT(bcache_request, bcache_request_end,
87 TP_PROTO(struct search *s, struct bio *bio),
59 TP_ARGS(s, bio) 88 TP_ARGS(s, bio)
60); 89);
61 90
62DECLARE_EVENT_CLASS(bcache_bio, 91DECLARE_EVENT_CLASS(bcache_bio,
63
64 TP_PROTO(struct bio *bio), 92 TP_PROTO(struct bio *bio),
65
66 TP_ARGS(bio), 93 TP_ARGS(bio),
67 94
68 TP_STRUCT__entry( 95 TP_STRUCT__entry(
@@ -70,7 +97,6 @@ DECLARE_EVENT_CLASS(bcache_bio,
70 __field(sector_t, sector ) 97 __field(sector_t, sector )
71 __field(unsigned int, nr_sector ) 98 __field(unsigned int, nr_sector )
72 __array(char, rwbs, 6 ) 99 __array(char, rwbs, 6 )
73 __array(char, comm, TASK_COMM_LEN )
74 ), 100 ),
75 101
76 TP_fast_assign( 102 TP_fast_assign(
@@ -78,191 +104,295 @@ DECLARE_EVENT_CLASS(bcache_bio,
78 __entry->sector = bio->bi_sector; 104 __entry->sector = bio->bi_sector;
79 __entry->nr_sector = bio->bi_size >> 9; 105 __entry->nr_sector = bio->bi_size >> 9;
80 blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_size); 106 blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_size);
81 memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
82 ), 107 ),
83 108
84 TP_printk("%d,%d %s %llu + %u [%s]", 109 TP_printk("%d,%d %s %llu + %u",
85 MAJOR(__entry->dev), MINOR(__entry->dev), 110 MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs,
86 __entry->rwbs, 111 (unsigned long long)__entry->sector, __entry->nr_sector)
87 (unsigned long long)__entry->sector,
88 __entry->nr_sector, __entry->comm)
89); 112);
90 113
91 114DEFINE_EVENT(bcache_bio, bcache_bypass_sequential,
92DEFINE_EVENT(bcache_bio, bcache_passthrough,
93
94 TP_PROTO(struct bio *bio), 115 TP_PROTO(struct bio *bio),
95
96 TP_ARGS(bio) 116 TP_ARGS(bio)
97); 117);
98 118
99DEFINE_EVENT(bcache_bio, bcache_cache_hit, 119DEFINE_EVENT(bcache_bio, bcache_bypass_congested,
100
101 TP_PROTO(struct bio *bio), 120 TP_PROTO(struct bio *bio),
102
103 TP_ARGS(bio) 121 TP_ARGS(bio)
104); 122);
105 123
106DEFINE_EVENT(bcache_bio, bcache_cache_miss, 124TRACE_EVENT(bcache_read,
125 TP_PROTO(struct bio *bio, bool hit, bool bypass),
126 TP_ARGS(bio, hit, bypass),
107 127
108 TP_PROTO(struct bio *bio), 128 TP_STRUCT__entry(
129 __field(dev_t, dev )
130 __field(sector_t, sector )
131 __field(unsigned int, nr_sector )
132 __array(char, rwbs, 6 )
133 __field(bool, cache_hit )
134 __field(bool, bypass )
135 ),
109 136
110 TP_ARGS(bio) 137 TP_fast_assign(
138 __entry->dev = bio->bi_bdev->bd_dev;
139 __entry->sector = bio->bi_sector;
140 __entry->nr_sector = bio->bi_size >> 9;
141 blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_size);
142 __entry->cache_hit = hit;
143 __entry->bypass = bypass;
144 ),
145
146 TP_printk("%d,%d %s %llu + %u hit %u bypass %u",
147 MAJOR(__entry->dev), MINOR(__entry->dev),
148 __entry->rwbs, (unsigned long long)__entry->sector,
149 __entry->nr_sector, __entry->cache_hit, __entry->bypass)
111); 150);
112 151
113DEFINE_EVENT(bcache_bio, bcache_read_retry, 152TRACE_EVENT(bcache_write,
153 TP_PROTO(struct bio *bio, bool writeback, bool bypass),
154 TP_ARGS(bio, writeback, bypass),
114 155
115 TP_PROTO(struct bio *bio), 156 TP_STRUCT__entry(
157 __field(dev_t, dev )
158 __field(sector_t, sector )
159 __field(unsigned int, nr_sector )
160 __array(char, rwbs, 6 )
161 __field(bool, writeback )
162 __field(bool, bypass )
163 ),
116 164
117 TP_ARGS(bio) 165 TP_fast_assign(
118); 166 __entry->dev = bio->bi_bdev->bd_dev;
167 __entry->sector = bio->bi_sector;
168 __entry->nr_sector = bio->bi_size >> 9;
169 blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_size);
170 __entry->writeback = writeback;
171 __entry->bypass = bypass;
172 ),
119 173
120DEFINE_EVENT(bcache_bio, bcache_writethrough, 174 TP_printk("%d,%d %s %llu + %u hit %u bypass %u",
175 MAJOR(__entry->dev), MINOR(__entry->dev),
176 __entry->rwbs, (unsigned long long)__entry->sector,
177 __entry->nr_sector, __entry->writeback, __entry->bypass)
178);
121 179
180DEFINE_EVENT(bcache_bio, bcache_read_retry,
122 TP_PROTO(struct bio *bio), 181 TP_PROTO(struct bio *bio),
123
124 TP_ARGS(bio) 182 TP_ARGS(bio)
125); 183);
126 184
127DEFINE_EVENT(bcache_bio, bcache_writeback, 185DEFINE_EVENT(bkey, bcache_cache_insert,
186 TP_PROTO(struct bkey *k),
187 TP_ARGS(k)
188);
128 189
129 TP_PROTO(struct bio *bio), 190/* Journal */
130 191
131 TP_ARGS(bio) 192DECLARE_EVENT_CLASS(cache_set,
132); 193 TP_PROTO(struct cache_set *c),
194 TP_ARGS(c),
133 195
134DEFINE_EVENT(bcache_bio, bcache_write_skip, 196 TP_STRUCT__entry(
197 __array(char, uuid, 16 )
198 ),
135 199
136 TP_PROTO(struct bio *bio), 200 TP_fast_assign(
201 memcpy(__entry->uuid, c->sb.set_uuid, 16);
202 ),
137 203
138 TP_ARGS(bio) 204 TP_printk("%pU", __entry->uuid)
139); 205);
140 206
141DEFINE_EVENT(bcache_bio, bcache_btree_read, 207DEFINE_EVENT(bkey, bcache_journal_replay_key,
142 208 TP_PROTO(struct bkey *k),
143 TP_PROTO(struct bio *bio), 209 TP_ARGS(k)
210);
144 211
145 TP_ARGS(bio) 212DEFINE_EVENT(cache_set, bcache_journal_full,
213 TP_PROTO(struct cache_set *c),
214 TP_ARGS(c)
146); 215);
147 216
148DEFINE_EVENT(bcache_bio, bcache_btree_write, 217DEFINE_EVENT(cache_set, bcache_journal_entry_full,
218 TP_PROTO(struct cache_set *c),
219 TP_ARGS(c)
220);
149 221
222DEFINE_EVENT(bcache_bio, bcache_journal_write,
150 TP_PROTO(struct bio *bio), 223 TP_PROTO(struct bio *bio),
151
152 TP_ARGS(bio) 224 TP_ARGS(bio)
153); 225);
154 226
155DEFINE_EVENT(bcache_bio, bcache_write_dirty, 227/* Btree */
156 228
157 TP_PROTO(struct bio *bio), 229DEFINE_EVENT(cache_set, bcache_btree_cache_cannibalize,
230 TP_PROTO(struct cache_set *c),
231 TP_ARGS(c)
232);
158 233
159 TP_ARGS(bio) 234DEFINE_EVENT(btree_node, bcache_btree_read,
235 TP_PROTO(struct btree *b),
236 TP_ARGS(b)
160); 237);
161 238
162DEFINE_EVENT(bcache_bio, bcache_read_dirty, 239TRACE_EVENT(bcache_btree_write,
240 TP_PROTO(struct btree *b),
241 TP_ARGS(b),
163 242
164 TP_PROTO(struct bio *bio), 243 TP_STRUCT__entry(
244 __field(size_t, bucket )
245 __field(unsigned, block )
246 __field(unsigned, keys )
247 ),
165 248
166 TP_ARGS(bio) 249 TP_fast_assign(
250 __entry->bucket = PTR_BUCKET_NR(b->c, &b->key, 0);
251 __entry->block = b->written;
252 __entry->keys = b->sets[b->nsets].data->keys;
253 ),
254
255 TP_printk("bucket %zu", __entry->bucket)
167); 256);
168 257
169DEFINE_EVENT(bcache_bio, bcache_write_moving, 258DEFINE_EVENT(btree_node, bcache_btree_node_alloc,
259 TP_PROTO(struct btree *b),
260 TP_ARGS(b)
261);
170 262
171 TP_PROTO(struct bio *bio), 263DEFINE_EVENT(btree_node, bcache_btree_node_alloc_fail,
264 TP_PROTO(struct btree *b),
265 TP_ARGS(b)
266);
172 267
173 TP_ARGS(bio) 268DEFINE_EVENT(btree_node, bcache_btree_node_free,
269 TP_PROTO(struct btree *b),
270 TP_ARGS(b)
174); 271);
175 272
176DEFINE_EVENT(bcache_bio, bcache_read_moving, 273TRACE_EVENT(bcache_btree_gc_coalesce,
274 TP_PROTO(unsigned nodes),
275 TP_ARGS(nodes),
177 276
178 TP_PROTO(struct bio *bio), 277 TP_STRUCT__entry(
278 __field(unsigned, nodes )
279 ),
179 280
180 TP_ARGS(bio) 281 TP_fast_assign(
181); 282 __entry->nodes = nodes;
283 ),
182 284
183DEFINE_EVENT(bcache_bio, bcache_journal_write, 285 TP_printk("coalesced %u nodes", __entry->nodes)
286);
184 287
185 TP_PROTO(struct bio *bio), 288DEFINE_EVENT(cache_set, bcache_gc_start,
289 TP_PROTO(struct cache_set *c),
290 TP_ARGS(c)
291);
186 292
187 TP_ARGS(bio) 293DEFINE_EVENT(cache_set, bcache_gc_end,
294 TP_PROTO(struct cache_set *c),
295 TP_ARGS(c)
188); 296);
189 297
190DECLARE_EVENT_CLASS(bcache_cache_bio, 298DEFINE_EVENT(bkey, bcache_gc_copy,
299 TP_PROTO(struct bkey *k),
300 TP_ARGS(k)
301);
191 302
192 TP_PROTO(struct bio *bio, 303DEFINE_EVENT(bkey, bcache_gc_copy_collision,
193 sector_t orig_sector, 304 TP_PROTO(struct bkey *k),
194 struct block_device* orig_bdev), 305 TP_ARGS(k)
306);
195 307
196 TP_ARGS(bio, orig_sector, orig_bdev), 308DECLARE_EVENT_CLASS(btree_split,
309 TP_PROTO(struct btree *b, unsigned keys),
310 TP_ARGS(b, keys),
197 311
198 TP_STRUCT__entry( 312 TP_STRUCT__entry(
199 __field(dev_t, dev ) 313 __field(size_t, bucket )
200 __field(dev_t, orig_dev ) 314 __field(unsigned, keys )
201 __field(sector_t, sector )
202 __field(sector_t, orig_sector )
203 __field(unsigned int, nr_sector )
204 __array(char, rwbs, 6 )
205 __array(char, comm, TASK_COMM_LEN )
206 ), 315 ),
207 316
208 TP_fast_assign( 317 TP_fast_assign(
209 __entry->dev = bio->bi_bdev->bd_dev; 318 __entry->bucket = PTR_BUCKET_NR(b->c, &b->key, 0);
210 __entry->orig_dev = orig_bdev->bd_dev; 319 __entry->keys = keys;
211 __entry->sector = bio->bi_sector;
212 __entry->orig_sector = orig_sector;
213 __entry->nr_sector = bio->bi_size >> 9;
214 blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_size);
215 memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
216 ), 320 ),
217 321
218 TP_printk("%d,%d %s %llu + %u [%s] (from %d,%d %llu)", 322 TP_printk("bucket %zu keys %u", __entry->bucket, __entry->keys)
219 MAJOR(__entry->dev), MINOR(__entry->dev),
220 __entry->rwbs,
221 (unsigned long long)__entry->sector,
222 __entry->nr_sector, __entry->comm,
223 MAJOR(__entry->orig_dev), MINOR(__entry->orig_dev),
224 (unsigned long long)__entry->orig_sector)
225); 323);
226 324
227DEFINE_EVENT(bcache_cache_bio, bcache_cache_insert, 325DEFINE_EVENT(btree_split, bcache_btree_node_split,
228 326 TP_PROTO(struct btree *b, unsigned keys),
229 TP_PROTO(struct bio *bio, 327 TP_ARGS(b, keys)
230 sector_t orig_sector, 328);
231 struct block_device *orig_bdev),
232 329
233 TP_ARGS(bio, orig_sector, orig_bdev) 330DEFINE_EVENT(btree_split, bcache_btree_node_compact,
331 TP_PROTO(struct btree *b, unsigned keys),
332 TP_ARGS(b, keys)
234); 333);
235 334
236DECLARE_EVENT_CLASS(bcache_gc, 335DEFINE_EVENT(btree_node, bcache_btree_set_root,
336 TP_PROTO(struct btree *b),
337 TP_ARGS(b)
338);
237 339
238 TP_PROTO(uint8_t *uuid), 340/* Allocator */
239 341
240 TP_ARGS(uuid), 342TRACE_EVENT(bcache_alloc_invalidate,
343 TP_PROTO(struct cache *ca),
344 TP_ARGS(ca),
241 345
242 TP_STRUCT__entry( 346 TP_STRUCT__entry(
243 __field(uint8_t *, uuid) 347 __field(unsigned, free )
348 __field(unsigned, free_inc )
349 __field(unsigned, free_inc_size )
350 __field(unsigned, unused )
244 ), 351 ),
245 352
246 TP_fast_assign( 353 TP_fast_assign(
247 __entry->uuid = uuid; 354 __entry->free = fifo_used(&ca->free);
355 __entry->free_inc = fifo_used(&ca->free_inc);
356 __entry->free_inc_size = ca->free_inc.size;
357 __entry->unused = fifo_used(&ca->unused);
248 ), 358 ),
249 359
250 TP_printk("%pU", __entry->uuid) 360 TP_printk("free %u free_inc %u/%u unused %u", __entry->free,
361 __entry->free_inc, __entry->free_inc_size, __entry->unused)
251); 362);
252 363
364TRACE_EVENT(bcache_alloc_fail,
365 TP_PROTO(struct cache *ca),
366 TP_ARGS(ca),
253 367
254DEFINE_EVENT(bcache_gc, bcache_gc_start, 368 TP_STRUCT__entry(
369 __field(unsigned, free )
370 __field(unsigned, free_inc )
371 __field(unsigned, unused )
372 __field(unsigned, blocked )
373 ),
255 374
256 TP_PROTO(uint8_t *uuid), 375 TP_fast_assign(
376 __entry->free = fifo_used(&ca->free);
377 __entry->free_inc = fifo_used(&ca->free_inc);
378 __entry->unused = fifo_used(&ca->unused);
379 __entry->blocked = atomic_read(&ca->set->prio_blocked);
380 ),
257 381
258 TP_ARGS(uuid) 382 TP_printk("free %u free_inc %u unused %u blocked %u", __entry->free,
383 __entry->free_inc, __entry->unused, __entry->blocked)
259); 384);
260 385
261DEFINE_EVENT(bcache_gc, bcache_gc_end, 386/* Background writeback */
262 387
263 TP_PROTO(uint8_t *uuid), 388DEFINE_EVENT(bkey, bcache_writeback,
389 TP_PROTO(struct bkey *k),
390 TP_ARGS(k)
391);
264 392
265 TP_ARGS(uuid) 393DEFINE_EVENT(bkey, bcache_writeback_collision,
394 TP_PROTO(struct bkey *k),
395 TP_ARGS(k)
266); 396);
267 397
268#endif /* _TRACE_BCACHE_H */ 398#endif /* _TRACE_BCACHE_H */