1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #undef TRACE_SYSTEM |
3 | #define TRACE_SYSTEM bcachefs |
4 | |
5 | #if !defined(_TRACE_BCACHEFS_H) || defined(TRACE_HEADER_MULTI_READ) |
6 | #define _TRACE_BCACHEFS_H |
7 | |
8 | #include <linux/tracepoint.h> |
9 | |
10 | #define TRACE_BPOS_entries(name) \ |
11 | __field(u64, name##_inode ) \ |
12 | __field(u64, name##_offset ) \ |
13 | __field(u32, name##_snapshot ) |
14 | |
15 | #define TRACE_BPOS_assign(dst, src) \ |
16 | __entry->dst##_inode = (src).inode; \ |
17 | __entry->dst##_offset = (src).offset; \ |
18 | __entry->dst##_snapshot = (src).snapshot |
19 | |
20 | DECLARE_EVENT_CLASS(bpos, |
21 | TP_PROTO(const struct bpos *p), |
22 | TP_ARGS(p), |
23 | |
24 | TP_STRUCT__entry( |
25 | TRACE_BPOS_entries(p) |
26 | ), |
27 | |
28 | TP_fast_assign( |
29 | TRACE_BPOS_assign(p, *p); |
30 | ), |
31 | |
32 | TP_printk("%llu:%llu:%u" , __entry->p_inode, __entry->p_offset, __entry->p_snapshot) |
33 | ); |
34 | |
35 | DECLARE_EVENT_CLASS(fs_str, |
36 | TP_PROTO(struct bch_fs *c, const char *str), |
37 | TP_ARGS(c, str), |
38 | |
39 | TP_STRUCT__entry( |
40 | __field(dev_t, dev ) |
41 | __string(str, str ) |
42 | ), |
43 | |
44 | TP_fast_assign( |
45 | __entry->dev = c->dev; |
46 | __assign_str(str, str); |
47 | ), |
48 | |
49 | TP_printk("%d,%d\n%s" , MAJOR(__entry->dev), MINOR(__entry->dev), __get_str(str)) |
50 | ); |
51 | |
52 | DECLARE_EVENT_CLASS(trans_str, |
53 | TP_PROTO(struct btree_trans *trans, unsigned long caller_ip, const char *str), |
54 | TP_ARGS(trans, caller_ip, str), |
55 | |
56 | TP_STRUCT__entry( |
57 | __field(dev_t, dev ) |
58 | __array(char, trans_fn, 32 ) |
59 | __field(unsigned long, caller_ip ) |
60 | __string(str, str ) |
61 | ), |
62 | |
63 | TP_fast_assign( |
64 | __entry->dev = trans->c->dev; |
65 | strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn)); |
66 | __entry->caller_ip = caller_ip; |
67 | __assign_str(str, str); |
68 | ), |
69 | |
70 | TP_printk("%d,%d %s %pS %s" , |
71 | MAJOR(__entry->dev), MINOR(__entry->dev), |
72 | __entry->trans_fn, (void *) __entry->caller_ip, __get_str(str)) |
73 | ); |
74 | |
75 | DECLARE_EVENT_CLASS(trans_str_nocaller, |
76 | TP_PROTO(struct btree_trans *trans, const char *str), |
77 | TP_ARGS(trans, str), |
78 | |
79 | TP_STRUCT__entry( |
80 | __field(dev_t, dev ) |
81 | __array(char, trans_fn, 32 ) |
82 | __string(str, str ) |
83 | ), |
84 | |
85 | TP_fast_assign( |
86 | __entry->dev = trans->c->dev; |
87 | strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn)); |
88 | __assign_str(str, str); |
89 | ), |
90 | |
91 | TP_printk("%d,%d %s %s" , |
92 | MAJOR(__entry->dev), MINOR(__entry->dev), |
93 | __entry->trans_fn, __get_str(str)) |
94 | ); |
95 | |
96 | DECLARE_EVENT_CLASS(btree_node_nofs, |
97 | TP_PROTO(struct bch_fs *c, struct btree *b), |
98 | TP_ARGS(c, b), |
99 | |
100 | TP_STRUCT__entry( |
101 | __field(dev_t, dev ) |
102 | __field(u8, level ) |
103 | __field(u8, btree_id ) |
104 | TRACE_BPOS_entries(pos) |
105 | ), |
106 | |
107 | TP_fast_assign( |
108 | __entry->dev = c->dev; |
109 | __entry->level = b->c.level; |
110 | __entry->btree_id = b->c.btree_id; |
111 | TRACE_BPOS_assign(pos, b->key.k.p); |
112 | ), |
113 | |
114 | TP_printk("%d,%d %u %s %llu:%llu:%u" , |
115 | MAJOR(__entry->dev), MINOR(__entry->dev), |
116 | __entry->level, |
117 | bch2_btree_id_str(__entry->btree_id), |
118 | __entry->pos_inode, __entry->pos_offset, __entry->pos_snapshot) |
119 | ); |
120 | |
121 | DECLARE_EVENT_CLASS(btree_node, |
122 | TP_PROTO(struct btree_trans *trans, struct btree *b), |
123 | TP_ARGS(trans, b), |
124 | |
125 | TP_STRUCT__entry( |
126 | __field(dev_t, dev ) |
127 | __array(char, trans_fn, 32 ) |
128 | __field(u8, level ) |
129 | __field(u8, btree_id ) |
130 | TRACE_BPOS_entries(pos) |
131 | ), |
132 | |
133 | TP_fast_assign( |
134 | __entry->dev = trans->c->dev; |
135 | strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn)); |
136 | __entry->level = b->c.level; |
137 | __entry->btree_id = b->c.btree_id; |
138 | TRACE_BPOS_assign(pos, b->key.k.p); |
139 | ), |
140 | |
141 | TP_printk("%d,%d %s %u %s %llu:%llu:%u" , |
142 | MAJOR(__entry->dev), MINOR(__entry->dev), __entry->trans_fn, |
143 | __entry->level, |
144 | bch2_btree_id_str(__entry->btree_id), |
145 | __entry->pos_inode, __entry->pos_offset, __entry->pos_snapshot) |
146 | ); |
147 | |
148 | DECLARE_EVENT_CLASS(bch_fs, |
149 | TP_PROTO(struct bch_fs *c), |
150 | TP_ARGS(c), |
151 | |
152 | TP_STRUCT__entry( |
153 | __field(dev_t, dev ) |
154 | ), |
155 | |
156 | TP_fast_assign( |
157 | __entry->dev = c->dev; |
158 | ), |
159 | |
160 | TP_printk("%d,%d" , MAJOR(__entry->dev), MINOR(__entry->dev)) |
161 | ); |
162 | |
163 | DECLARE_EVENT_CLASS(btree_trans, |
164 | TP_PROTO(struct btree_trans *trans), |
165 | TP_ARGS(trans), |
166 | |
167 | TP_STRUCT__entry( |
168 | __field(dev_t, dev ) |
169 | __array(char, trans_fn, 32 ) |
170 | ), |
171 | |
172 | TP_fast_assign( |
173 | __entry->dev = trans->c->dev; |
174 | strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn)); |
175 | ), |
176 | |
177 | TP_printk("%d,%d %s" , MAJOR(__entry->dev), MINOR(__entry->dev), __entry->trans_fn) |
178 | ); |
179 | |
180 | DECLARE_EVENT_CLASS(bio, |
181 | TP_PROTO(struct bio *bio), |
182 | TP_ARGS(bio), |
183 | |
184 | TP_STRUCT__entry( |
185 | __field(dev_t, dev ) |
186 | __field(sector_t, sector ) |
187 | __field(unsigned int, nr_sector ) |
188 | __array(char, rwbs, 6 ) |
189 | ), |
190 | |
191 | TP_fast_assign( |
192 | __entry->dev = bio->bi_bdev ? bio_dev(bio) : 0; |
193 | __entry->sector = bio->bi_iter.bi_sector; |
194 | __entry->nr_sector = bio->bi_iter.bi_size >> 9; |
195 | blk_fill_rwbs(__entry->rwbs, bio->bi_opf); |
196 | ), |
197 | |
198 | TP_printk("%d,%d %s %llu + %u" , |
199 | MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs, |
200 | (unsigned long long)__entry->sector, __entry->nr_sector) |
201 | ); |
202 | |
203 | /* super-io.c: */ |
204 | TRACE_EVENT(write_super, |
205 | TP_PROTO(struct bch_fs *c, unsigned long ip), |
206 | TP_ARGS(c, ip), |
207 | |
208 | TP_STRUCT__entry( |
209 | __field(dev_t, dev ) |
210 | __field(unsigned long, ip ) |
211 | ), |
212 | |
213 | TP_fast_assign( |
214 | __entry->dev = c->dev; |
215 | __entry->ip = ip; |
216 | ), |
217 | |
218 | TP_printk("%d,%d for %pS" , |
219 | MAJOR(__entry->dev), MINOR(__entry->dev), |
220 | (void *) __entry->ip) |
221 | ); |
222 | |
223 | /* io.c: */ |
224 | |
225 | DEFINE_EVENT(bio, read_promote, |
226 | TP_PROTO(struct bio *bio), |
227 | TP_ARGS(bio) |
228 | ); |
229 | |
230 | TRACE_EVENT(read_nopromote, |
231 | TP_PROTO(struct bch_fs *c, int ret), |
232 | TP_ARGS(c, ret), |
233 | |
234 | TP_STRUCT__entry( |
235 | __field(dev_t, dev ) |
236 | __array(char, ret, 32 ) |
237 | ), |
238 | |
239 | TP_fast_assign( |
240 | __entry->dev = c->dev; |
241 | strscpy(__entry->ret, bch2_err_str(ret), sizeof(__entry->ret)); |
242 | ), |
243 | |
244 | TP_printk("%d,%d ret %s" , |
245 | MAJOR(__entry->dev), MINOR(__entry->dev), |
246 | __entry->ret) |
247 | ); |
248 | |
249 | DEFINE_EVENT(bio, read_bounce, |
250 | TP_PROTO(struct bio *bio), |
251 | TP_ARGS(bio) |
252 | ); |
253 | |
254 | DEFINE_EVENT(bio, read_split, |
255 | TP_PROTO(struct bio *bio), |
256 | TP_ARGS(bio) |
257 | ); |
258 | |
259 | DEFINE_EVENT(bio, read_retry, |
260 | TP_PROTO(struct bio *bio), |
261 | TP_ARGS(bio) |
262 | ); |
263 | |
264 | DEFINE_EVENT(bio, read_reuse_race, |
265 | TP_PROTO(struct bio *bio), |
266 | TP_ARGS(bio) |
267 | ); |
268 | |
269 | /* Journal */ |
270 | |
271 | DEFINE_EVENT(bch_fs, journal_full, |
272 | TP_PROTO(struct bch_fs *c), |
273 | TP_ARGS(c) |
274 | ); |
275 | |
276 | DEFINE_EVENT(fs_str, journal_entry_full, |
277 | TP_PROTO(struct bch_fs *c, const char *str), |
278 | TP_ARGS(c, str) |
279 | ); |
280 | |
281 | DEFINE_EVENT(fs_str, journal_entry_close, |
282 | TP_PROTO(struct bch_fs *c, const char *str), |
283 | TP_ARGS(c, str) |
284 | ); |
285 | |
286 | DEFINE_EVENT(bio, journal_write, |
287 | TP_PROTO(struct bio *bio), |
288 | TP_ARGS(bio) |
289 | ); |
290 | |
291 | TRACE_EVENT(journal_reclaim_start, |
292 | TP_PROTO(struct bch_fs *c, bool direct, bool kicked, |
293 | u64 min_nr, u64 min_key_cache, |
294 | u64 btree_cache_dirty, u64 btree_cache_total, |
295 | u64 btree_key_cache_dirty, u64 btree_key_cache_total), |
296 | TP_ARGS(c, direct, kicked, min_nr, min_key_cache, |
297 | btree_cache_dirty, btree_cache_total, |
298 | btree_key_cache_dirty, btree_key_cache_total), |
299 | |
300 | TP_STRUCT__entry( |
301 | __field(dev_t, dev ) |
302 | __field(bool, direct ) |
303 | __field(bool, kicked ) |
304 | __field(u64, min_nr ) |
305 | __field(u64, min_key_cache ) |
306 | __field(u64, btree_cache_dirty ) |
307 | __field(u64, btree_cache_total ) |
308 | __field(u64, btree_key_cache_dirty ) |
309 | __field(u64, btree_key_cache_total ) |
310 | ), |
311 | |
312 | TP_fast_assign( |
313 | __entry->dev = c->dev; |
314 | __entry->direct = direct; |
315 | __entry->kicked = kicked; |
316 | __entry->min_nr = min_nr; |
317 | __entry->min_key_cache = min_key_cache; |
318 | __entry->btree_cache_dirty = btree_cache_dirty; |
319 | __entry->btree_cache_total = btree_cache_total; |
320 | __entry->btree_key_cache_dirty = btree_key_cache_dirty; |
321 | __entry->btree_key_cache_total = btree_key_cache_total; |
322 | ), |
323 | |
324 | TP_printk("%d,%d direct %u kicked %u min %llu key cache %llu btree cache %llu/%llu key cache %llu/%llu" , |
325 | MAJOR(__entry->dev), MINOR(__entry->dev), |
326 | __entry->direct, |
327 | __entry->kicked, |
328 | __entry->min_nr, |
329 | __entry->min_key_cache, |
330 | __entry->btree_cache_dirty, |
331 | __entry->btree_cache_total, |
332 | __entry->btree_key_cache_dirty, |
333 | __entry->btree_key_cache_total) |
334 | ); |
335 | |
336 | TRACE_EVENT(journal_reclaim_finish, |
337 | TP_PROTO(struct bch_fs *c, u64 nr_flushed), |
338 | TP_ARGS(c, nr_flushed), |
339 | |
340 | TP_STRUCT__entry( |
341 | __field(dev_t, dev ) |
342 | __field(u64, nr_flushed ) |
343 | ), |
344 | |
345 | TP_fast_assign( |
346 | __entry->dev = c->dev; |
347 | __entry->nr_flushed = nr_flushed; |
348 | ), |
349 | |
350 | TP_printk("%d,%d flushed %llu" , |
351 | MAJOR(__entry->dev), MINOR(__entry->dev), |
352 | __entry->nr_flushed) |
353 | ); |
354 | |
355 | /* bset.c: */ |
356 | |
357 | DEFINE_EVENT(bpos, bkey_pack_pos_fail, |
358 | TP_PROTO(const struct bpos *p), |
359 | TP_ARGS(p) |
360 | ); |
361 | |
362 | /* Btree cache: */ |
363 | |
364 | TRACE_EVENT(btree_cache_scan, |
365 | TP_PROTO(long nr_to_scan, long can_free, long ret), |
366 | TP_ARGS(nr_to_scan, can_free, ret), |
367 | |
368 | TP_STRUCT__entry( |
369 | __field(long, nr_to_scan ) |
370 | __field(long, can_free ) |
371 | __field(long, ret ) |
372 | ), |
373 | |
374 | TP_fast_assign( |
375 | __entry->nr_to_scan = nr_to_scan; |
376 | __entry->can_free = can_free; |
377 | __entry->ret = ret; |
378 | ), |
379 | |
380 | TP_printk("scanned for %li nodes, can free %li, ret %li" , |
381 | __entry->nr_to_scan, __entry->can_free, __entry->ret) |
382 | ); |
383 | |
384 | DEFINE_EVENT(btree_node_nofs, btree_cache_reap, |
385 | TP_PROTO(struct bch_fs *c, struct btree *b), |
386 | TP_ARGS(c, b) |
387 | ); |
388 | |
389 | DEFINE_EVENT(btree_trans, btree_cache_cannibalize_lock_fail, |
390 | TP_PROTO(struct btree_trans *trans), |
391 | TP_ARGS(trans) |
392 | ); |
393 | |
394 | DEFINE_EVENT(btree_trans, btree_cache_cannibalize_lock, |
395 | TP_PROTO(struct btree_trans *trans), |
396 | TP_ARGS(trans) |
397 | ); |
398 | |
399 | DEFINE_EVENT(btree_trans, btree_cache_cannibalize, |
400 | TP_PROTO(struct btree_trans *trans), |
401 | TP_ARGS(trans) |
402 | ); |
403 | |
404 | DEFINE_EVENT(btree_trans, btree_cache_cannibalize_unlock, |
405 | TP_PROTO(struct btree_trans *trans), |
406 | TP_ARGS(trans) |
407 | ); |
408 | |
409 | /* Btree */ |
410 | |
411 | DEFINE_EVENT(btree_node, btree_node_read, |
412 | TP_PROTO(struct btree_trans *trans, struct btree *b), |
413 | TP_ARGS(trans, b) |
414 | ); |
415 | |
416 | TRACE_EVENT(btree_node_write, |
417 | TP_PROTO(struct btree *b, unsigned bytes, unsigned sectors), |
418 | TP_ARGS(b, bytes, sectors), |
419 | |
420 | TP_STRUCT__entry( |
421 | __field(enum btree_node_type, type) |
422 | __field(unsigned, bytes ) |
423 | __field(unsigned, sectors ) |
424 | ), |
425 | |
426 | TP_fast_assign( |
427 | __entry->type = btree_node_type(b); |
428 | __entry->bytes = bytes; |
429 | __entry->sectors = sectors; |
430 | ), |
431 | |
432 | TP_printk("bkey type %u bytes %u sectors %u" , |
433 | __entry->type , __entry->bytes, __entry->sectors) |
434 | ); |
435 | |
436 | DEFINE_EVENT(btree_node, btree_node_alloc, |
437 | TP_PROTO(struct btree_trans *trans, struct btree *b), |
438 | TP_ARGS(trans, b) |
439 | ); |
440 | |
441 | DEFINE_EVENT(btree_node, btree_node_free, |
442 | TP_PROTO(struct btree_trans *trans, struct btree *b), |
443 | TP_ARGS(trans, b) |
444 | ); |
445 | |
446 | TRACE_EVENT(btree_reserve_get_fail, |
447 | TP_PROTO(const char *trans_fn, |
448 | unsigned long caller_ip, |
449 | size_t required, |
450 | int ret), |
451 | TP_ARGS(trans_fn, caller_ip, required, ret), |
452 | |
453 | TP_STRUCT__entry( |
454 | __array(char, trans_fn, 32 ) |
455 | __field(unsigned long, caller_ip ) |
456 | __field(size_t, required ) |
457 | __array(char, ret, 32 ) |
458 | ), |
459 | |
460 | TP_fast_assign( |
461 | strscpy(__entry->trans_fn, trans_fn, sizeof(__entry->trans_fn)); |
462 | __entry->caller_ip = caller_ip; |
463 | __entry->required = required; |
464 | strscpy(__entry->ret, bch2_err_str(ret), sizeof(__entry->ret)); |
465 | ), |
466 | |
467 | TP_printk("%s %pS required %zu ret %s" , |
468 | __entry->trans_fn, |
469 | (void *) __entry->caller_ip, |
470 | __entry->required, |
471 | __entry->ret) |
472 | ); |
473 | |
474 | DEFINE_EVENT(btree_node, btree_node_compact, |
475 | TP_PROTO(struct btree_trans *trans, struct btree *b), |
476 | TP_ARGS(trans, b) |
477 | ); |
478 | |
479 | DEFINE_EVENT(btree_node, btree_node_merge, |
480 | TP_PROTO(struct btree_trans *trans, struct btree *b), |
481 | TP_ARGS(trans, b) |
482 | ); |
483 | |
484 | DEFINE_EVENT(btree_node, btree_node_split, |
485 | TP_PROTO(struct btree_trans *trans, struct btree *b), |
486 | TP_ARGS(trans, b) |
487 | ); |
488 | |
489 | DEFINE_EVENT(btree_node, btree_node_rewrite, |
490 | TP_PROTO(struct btree_trans *trans, struct btree *b), |
491 | TP_ARGS(trans, b) |
492 | ); |
493 | |
494 | DEFINE_EVENT(btree_node, btree_node_set_root, |
495 | TP_PROTO(struct btree_trans *trans, struct btree *b), |
496 | TP_ARGS(trans, b) |
497 | ); |
498 | |
499 | TRACE_EVENT(btree_path_relock_fail, |
500 | TP_PROTO(struct btree_trans *trans, |
501 | unsigned long caller_ip, |
502 | struct btree_path *path, |
503 | unsigned level), |
504 | TP_ARGS(trans, caller_ip, path, level), |
505 | |
506 | TP_STRUCT__entry( |
507 | __array(char, trans_fn, 32 ) |
508 | __field(unsigned long, caller_ip ) |
509 | __field(u8, btree_id ) |
510 | __field(u8, level ) |
511 | TRACE_BPOS_entries(pos) |
512 | __array(char, node, 24 ) |
513 | __field(u8, self_read_count ) |
514 | __field(u8, self_intent_count) |
515 | __field(u8, read_count ) |
516 | __field(u8, intent_count ) |
517 | __field(u32, iter_lock_seq ) |
518 | __field(u32, node_lock_seq ) |
519 | ), |
520 | |
521 | TP_fast_assign( |
522 | struct btree *b = btree_path_node(path, level); |
523 | struct six_lock_count c; |
524 | |
525 | strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn)); |
526 | __entry->caller_ip = caller_ip; |
527 | __entry->btree_id = path->btree_id; |
528 | __entry->level = path->level; |
529 | TRACE_BPOS_assign(pos, path->pos); |
530 | |
531 | c = bch2_btree_node_lock_counts(trans, NULL, &path->l[level].b->c, level); |
532 | __entry->self_read_count = c.n[SIX_LOCK_read]; |
533 | __entry->self_intent_count = c.n[SIX_LOCK_intent]; |
534 | |
535 | if (IS_ERR(b)) { |
536 | strscpy(__entry->node, bch2_err_str(PTR_ERR(b)), sizeof(__entry->node)); |
537 | } else { |
538 | c = six_lock_counts(&path->l[level].b->c.lock); |
539 | __entry->read_count = c.n[SIX_LOCK_read]; |
540 | __entry->intent_count = c.n[SIX_LOCK_intent]; |
541 | scnprintf(__entry->node, sizeof(__entry->node), "%px" , b); |
542 | } |
543 | __entry->iter_lock_seq = path->l[level].lock_seq; |
544 | __entry->node_lock_seq = is_btree_node(path, level) |
545 | ? six_lock_seq(&path->l[level].b->c.lock) |
546 | : 0; |
547 | ), |
548 | |
549 | TP_printk("%s %pS btree %s pos %llu:%llu:%u level %u node %s held %u:%u lock count %u:%u iter seq %u lock seq %u" , |
550 | __entry->trans_fn, |
551 | (void *) __entry->caller_ip, |
552 | bch2_btree_id_str(__entry->btree_id), |
553 | __entry->pos_inode, |
554 | __entry->pos_offset, |
555 | __entry->pos_snapshot, |
556 | __entry->level, |
557 | __entry->node, |
558 | __entry->self_read_count, |
559 | __entry->self_intent_count, |
560 | __entry->read_count, |
561 | __entry->intent_count, |
562 | __entry->iter_lock_seq, |
563 | __entry->node_lock_seq) |
564 | ); |
565 | |
566 | TRACE_EVENT(btree_path_upgrade_fail, |
567 | TP_PROTO(struct btree_trans *trans, |
568 | unsigned long caller_ip, |
569 | struct btree_path *path, |
570 | unsigned level), |
571 | TP_ARGS(trans, caller_ip, path, level), |
572 | |
573 | TP_STRUCT__entry( |
574 | __array(char, trans_fn, 32 ) |
575 | __field(unsigned long, caller_ip ) |
576 | __field(u8, btree_id ) |
577 | __field(u8, level ) |
578 | TRACE_BPOS_entries(pos) |
579 | __field(u8, locked ) |
580 | __field(u8, self_read_count ) |
581 | __field(u8, self_intent_count) |
582 | __field(u8, read_count ) |
583 | __field(u8, intent_count ) |
584 | __field(u32, iter_lock_seq ) |
585 | __field(u32, node_lock_seq ) |
586 | ), |
587 | |
588 | TP_fast_assign( |
589 | struct six_lock_count c; |
590 | |
591 | strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn)); |
592 | __entry->caller_ip = caller_ip; |
593 | __entry->btree_id = path->btree_id; |
594 | __entry->level = level; |
595 | TRACE_BPOS_assign(pos, path->pos); |
596 | __entry->locked = btree_node_locked(path, level); |
597 | |
598 | c = bch2_btree_node_lock_counts(trans, NULL, &path->l[level].b->c, level), |
599 | __entry->self_read_count = c.n[SIX_LOCK_read]; |
600 | __entry->self_intent_count = c.n[SIX_LOCK_intent]; |
601 | c = six_lock_counts(&path->l[level].b->c.lock); |
602 | __entry->read_count = c.n[SIX_LOCK_read]; |
603 | __entry->intent_count = c.n[SIX_LOCK_intent]; |
604 | __entry->iter_lock_seq = path->l[level].lock_seq; |
605 | __entry->node_lock_seq = is_btree_node(path, level) |
606 | ? six_lock_seq(&path->l[level].b->c.lock) |
607 | : 0; |
608 | ), |
609 | |
610 | TP_printk("%s %pS btree %s pos %llu:%llu:%u level %u locked %u held %u:%u lock count %u:%u iter seq %u lock seq %u" , |
611 | __entry->trans_fn, |
612 | (void *) __entry->caller_ip, |
613 | bch2_btree_id_str(__entry->btree_id), |
614 | __entry->pos_inode, |
615 | __entry->pos_offset, |
616 | __entry->pos_snapshot, |
617 | __entry->level, |
618 | __entry->locked, |
619 | __entry->self_read_count, |
620 | __entry->self_intent_count, |
621 | __entry->read_count, |
622 | __entry->intent_count, |
623 | __entry->iter_lock_seq, |
624 | __entry->node_lock_seq) |
625 | ); |
626 | |
627 | /* Garbage collection */ |
628 | |
629 | DEFINE_EVENT(bch_fs, gc_gens_start, |
630 | TP_PROTO(struct bch_fs *c), |
631 | TP_ARGS(c) |
632 | ); |
633 | |
634 | DEFINE_EVENT(bch_fs, gc_gens_end, |
635 | TP_PROTO(struct bch_fs *c), |
636 | TP_ARGS(c) |
637 | ); |
638 | |
639 | /* Allocator */ |
640 | |
641 | DECLARE_EVENT_CLASS(bucket_alloc, |
642 | TP_PROTO(struct bch_dev *ca, const char *alloc_reserve, |
643 | u64 bucket, |
644 | u64 free, |
645 | u64 avail, |
646 | u64 copygc_wait_amount, |
647 | s64 copygc_waiting_for, |
648 | struct bucket_alloc_state *s, |
649 | bool nonblocking, |
650 | const char *err), |
651 | TP_ARGS(ca, alloc_reserve, bucket, free, avail, |
652 | copygc_wait_amount, copygc_waiting_for, |
653 | s, nonblocking, err), |
654 | |
655 | TP_STRUCT__entry( |
656 | __field(u8, dev ) |
657 | __array(char, reserve, 16 ) |
658 | __field(u64, bucket ) |
659 | __field(u64, free ) |
660 | __field(u64, avail ) |
661 | __field(u64, copygc_wait_amount ) |
662 | __field(s64, copygc_waiting_for ) |
663 | __field(u64, seen ) |
664 | __field(u64, open ) |
665 | __field(u64, need_journal_commit ) |
666 | __field(u64, nouse ) |
667 | __field(bool, nonblocking ) |
668 | __field(u64, nocow ) |
669 | __array(char, err, 32 ) |
670 | ), |
671 | |
672 | TP_fast_assign( |
673 | __entry->dev = ca->dev_idx; |
674 | strscpy(__entry->reserve, alloc_reserve, sizeof(__entry->reserve)); |
675 | __entry->bucket = bucket; |
676 | __entry->free = free; |
677 | __entry->avail = avail; |
678 | __entry->copygc_wait_amount = copygc_wait_amount; |
679 | __entry->copygc_waiting_for = copygc_waiting_for; |
680 | __entry->seen = s->buckets_seen; |
681 | __entry->open = s->skipped_open; |
682 | __entry->need_journal_commit = s->skipped_need_journal_commit; |
683 | __entry->nouse = s->skipped_nouse; |
684 | __entry->nonblocking = nonblocking; |
685 | __entry->nocow = s->skipped_nocow; |
686 | strscpy(__entry->err, err, sizeof(__entry->err)); |
687 | ), |
688 | |
689 | TP_printk("reserve %s bucket %u:%llu free %llu avail %llu copygc_wait %llu/%lli seen %llu open %llu need_journal_commit %llu nouse %llu nocow %llu nonblocking %u err %s" , |
690 | __entry->reserve, |
691 | __entry->dev, |
692 | __entry->bucket, |
693 | __entry->free, |
694 | __entry->avail, |
695 | __entry->copygc_wait_amount, |
696 | __entry->copygc_waiting_for, |
697 | __entry->seen, |
698 | __entry->open, |
699 | __entry->need_journal_commit, |
700 | __entry->nouse, |
701 | __entry->nocow, |
702 | __entry->nonblocking, |
703 | __entry->err) |
704 | ); |
705 | |
706 | DEFINE_EVENT(bucket_alloc, bucket_alloc, |
707 | TP_PROTO(struct bch_dev *ca, const char *alloc_reserve, |
708 | u64 bucket, |
709 | u64 free, |
710 | u64 avail, |
711 | u64 copygc_wait_amount, |
712 | s64 copygc_waiting_for, |
713 | struct bucket_alloc_state *s, |
714 | bool nonblocking, |
715 | const char *err), |
716 | TP_ARGS(ca, alloc_reserve, bucket, free, avail, |
717 | copygc_wait_amount, copygc_waiting_for, |
718 | s, nonblocking, err) |
719 | ); |
720 | |
721 | DEFINE_EVENT(bucket_alloc, bucket_alloc_fail, |
722 | TP_PROTO(struct bch_dev *ca, const char *alloc_reserve, |
723 | u64 bucket, |
724 | u64 free, |
725 | u64 avail, |
726 | u64 copygc_wait_amount, |
727 | s64 copygc_waiting_for, |
728 | struct bucket_alloc_state *s, |
729 | bool nonblocking, |
730 | const char *err), |
731 | TP_ARGS(ca, alloc_reserve, bucket, free, avail, |
732 | copygc_wait_amount, copygc_waiting_for, |
733 | s, nonblocking, err) |
734 | ); |
735 | |
736 | TRACE_EVENT(discard_buckets, |
737 | TP_PROTO(struct bch_fs *c, u64 seen, u64 open, |
738 | u64 need_journal_commit, u64 discarded, const char *err), |
739 | TP_ARGS(c, seen, open, need_journal_commit, discarded, err), |
740 | |
741 | TP_STRUCT__entry( |
742 | __field(dev_t, dev ) |
743 | __field(u64, seen ) |
744 | __field(u64, open ) |
745 | __field(u64, need_journal_commit ) |
746 | __field(u64, discarded ) |
747 | __array(char, err, 16 ) |
748 | ), |
749 | |
750 | TP_fast_assign( |
751 | __entry->dev = c->dev; |
752 | __entry->seen = seen; |
753 | __entry->open = open; |
754 | __entry->need_journal_commit = need_journal_commit; |
755 | __entry->discarded = discarded; |
756 | strscpy(__entry->err, err, sizeof(__entry->err)); |
757 | ), |
758 | |
759 | TP_printk("%d%d seen %llu open %llu need_journal_commit %llu discarded %llu err %s" , |
760 | MAJOR(__entry->dev), MINOR(__entry->dev), |
761 | __entry->seen, |
762 | __entry->open, |
763 | __entry->need_journal_commit, |
764 | __entry->discarded, |
765 | __entry->err) |
766 | ); |
767 | |
768 | TRACE_EVENT(bucket_invalidate, |
769 | TP_PROTO(struct bch_fs *c, unsigned dev, u64 bucket, u32 sectors), |
770 | TP_ARGS(c, dev, bucket, sectors), |
771 | |
772 | TP_STRUCT__entry( |
773 | __field(dev_t, dev ) |
774 | __field(u32, dev_idx ) |
775 | __field(u32, sectors ) |
776 | __field(u64, bucket ) |
777 | ), |
778 | |
779 | TP_fast_assign( |
780 | __entry->dev = c->dev; |
781 | __entry->dev_idx = dev; |
782 | __entry->sectors = sectors; |
783 | __entry->bucket = bucket; |
784 | ), |
785 | |
786 | TP_printk("%d:%d invalidated %u:%llu cached sectors %u" , |
787 | MAJOR(__entry->dev), MINOR(__entry->dev), |
788 | __entry->dev_idx, __entry->bucket, |
789 | __entry->sectors) |
790 | ); |
791 | |
792 | /* Moving IO */ |
793 | |
794 | TRACE_EVENT(bucket_evacuate, |
795 | TP_PROTO(struct bch_fs *c, struct bpos *bucket), |
796 | TP_ARGS(c, bucket), |
797 | |
798 | TP_STRUCT__entry( |
799 | __field(dev_t, dev ) |
800 | __field(u32, dev_idx ) |
801 | __field(u64, bucket ) |
802 | ), |
803 | |
804 | TP_fast_assign( |
805 | __entry->dev = c->dev; |
806 | __entry->dev_idx = bucket->inode; |
807 | __entry->bucket = bucket->offset; |
808 | ), |
809 | |
810 | TP_printk("%d:%d %u:%llu" , |
811 | MAJOR(__entry->dev), MINOR(__entry->dev), |
812 | __entry->dev_idx, __entry->bucket) |
813 | ); |
814 | |
815 | DEFINE_EVENT(fs_str, move_extent, |
816 | TP_PROTO(struct bch_fs *c, const char *str), |
817 | TP_ARGS(c, str) |
818 | ); |
819 | |
820 | DEFINE_EVENT(fs_str, move_extent_read, |
821 | TP_PROTO(struct bch_fs *c, const char *str), |
822 | TP_ARGS(c, str) |
823 | ); |
824 | |
825 | DEFINE_EVENT(fs_str, move_extent_write, |
826 | TP_PROTO(struct bch_fs *c, const char *str), |
827 | TP_ARGS(c, str) |
828 | ); |
829 | |
830 | DEFINE_EVENT(fs_str, move_extent_finish, |
831 | TP_PROTO(struct bch_fs *c, const char *str), |
832 | TP_ARGS(c, str) |
833 | ); |
834 | |
835 | DEFINE_EVENT(fs_str, move_extent_fail, |
836 | TP_PROTO(struct bch_fs *c, const char *str), |
837 | TP_ARGS(c, str) |
838 | ); |
839 | |
840 | DEFINE_EVENT(fs_str, move_extent_start_fail, |
841 | TP_PROTO(struct bch_fs *c, const char *str), |
842 | TP_ARGS(c, str) |
843 | ); |
844 | |
845 | TRACE_EVENT(move_data, |
846 | TP_PROTO(struct bch_fs *c, |
847 | struct bch_move_stats *stats), |
848 | TP_ARGS(c, stats), |
849 | |
850 | TP_STRUCT__entry( |
851 | __field(dev_t, dev ) |
852 | __field(u64, keys_moved ) |
853 | __field(u64, keys_raced ) |
854 | __field(u64, sectors_seen ) |
855 | __field(u64, sectors_moved ) |
856 | __field(u64, sectors_raced ) |
857 | ), |
858 | |
859 | TP_fast_assign( |
860 | __entry->dev = c->dev; |
861 | __entry->keys_moved = atomic64_read(&stats->keys_moved); |
862 | __entry->keys_raced = atomic64_read(&stats->keys_raced); |
863 | __entry->sectors_seen = atomic64_read(&stats->sectors_seen); |
864 | __entry->sectors_moved = atomic64_read(&stats->sectors_moved); |
865 | __entry->sectors_raced = atomic64_read(&stats->sectors_raced); |
866 | ), |
867 | |
868 | TP_printk("%d,%d keys moved %llu raced %llu" |
869 | "sectors seen %llu moved %llu raced %llu" , |
870 | MAJOR(__entry->dev), MINOR(__entry->dev), |
871 | __entry->keys_moved, |
872 | __entry->keys_raced, |
873 | __entry->sectors_seen, |
874 | __entry->sectors_moved, |
875 | __entry->sectors_raced) |
876 | ); |
877 | |
878 | TRACE_EVENT(evacuate_bucket, |
879 | TP_PROTO(struct bch_fs *c, struct bpos *bucket, |
880 | unsigned sectors, unsigned bucket_size, |
881 | u64 fragmentation, int ret), |
882 | TP_ARGS(c, bucket, sectors, bucket_size, fragmentation, ret), |
883 | |
884 | TP_STRUCT__entry( |
885 | __field(dev_t, dev ) |
886 | __field(u64, member ) |
887 | __field(u64, bucket ) |
888 | __field(u32, sectors ) |
889 | __field(u32, bucket_size ) |
890 | __field(u64, fragmentation ) |
891 | __field(int, ret ) |
892 | ), |
893 | |
894 | TP_fast_assign( |
895 | __entry->dev = c->dev; |
896 | __entry->member = bucket->inode; |
897 | __entry->bucket = bucket->offset; |
898 | __entry->sectors = sectors; |
899 | __entry->bucket_size = bucket_size; |
900 | __entry->fragmentation = fragmentation; |
901 | __entry->ret = ret; |
902 | ), |
903 | |
904 | TP_printk("%d,%d %llu:%llu sectors %u/%u fragmentation %llu ret %i" , |
905 | MAJOR(__entry->dev), MINOR(__entry->dev), |
906 | __entry->member, __entry->bucket, |
907 | __entry->sectors, __entry->bucket_size, |
908 | __entry->fragmentation, __entry->ret) |
909 | ); |
910 | |
911 | TRACE_EVENT(copygc, |
912 | TP_PROTO(struct bch_fs *c, |
913 | u64 sectors_moved, u64 sectors_not_moved, |
914 | u64 buckets_moved, u64 buckets_not_moved), |
915 | TP_ARGS(c, |
916 | sectors_moved, sectors_not_moved, |
917 | buckets_moved, buckets_not_moved), |
918 | |
919 | TP_STRUCT__entry( |
920 | __field(dev_t, dev ) |
921 | __field(u64, sectors_moved ) |
922 | __field(u64, sectors_not_moved ) |
923 | __field(u64, buckets_moved ) |
924 | __field(u64, buckets_not_moved ) |
925 | ), |
926 | |
927 | TP_fast_assign( |
928 | __entry->dev = c->dev; |
929 | __entry->sectors_moved = sectors_moved; |
930 | __entry->sectors_not_moved = sectors_not_moved; |
931 | __entry->buckets_moved = buckets_moved; |
932 | __entry->buckets_not_moved = buckets_moved; |
933 | ), |
934 | |
935 | TP_printk("%d,%d sectors moved %llu remain %llu buckets moved %llu remain %llu" , |
936 | MAJOR(__entry->dev), MINOR(__entry->dev), |
937 | __entry->sectors_moved, __entry->sectors_not_moved, |
938 | __entry->buckets_moved, __entry->buckets_not_moved) |
939 | ); |
940 | |
941 | TRACE_EVENT(copygc_wait, |
942 | TP_PROTO(struct bch_fs *c, |
943 | u64 wait_amount, u64 until), |
944 | TP_ARGS(c, wait_amount, until), |
945 | |
946 | TP_STRUCT__entry( |
947 | __field(dev_t, dev ) |
948 | __field(u64, wait_amount ) |
949 | __field(u64, until ) |
950 | ), |
951 | |
952 | TP_fast_assign( |
953 | __entry->dev = c->dev; |
954 | __entry->wait_amount = wait_amount; |
955 | __entry->until = until; |
956 | ), |
957 | |
958 | TP_printk("%d,%u waiting for %llu sectors until %llu" , |
959 | MAJOR(__entry->dev), MINOR(__entry->dev), |
960 | __entry->wait_amount, __entry->until) |
961 | ); |
962 | |
963 | /* btree transactions: */ |
964 | |
965 | DECLARE_EVENT_CLASS(transaction_event, |
966 | TP_PROTO(struct btree_trans *trans, |
967 | unsigned long caller_ip), |
968 | TP_ARGS(trans, caller_ip), |
969 | |
970 | TP_STRUCT__entry( |
971 | __array(char, trans_fn, 32 ) |
972 | __field(unsigned long, caller_ip ) |
973 | ), |
974 | |
975 | TP_fast_assign( |
976 | strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn)); |
977 | __entry->caller_ip = caller_ip; |
978 | ), |
979 | |
980 | TP_printk("%s %pS" , __entry->trans_fn, (void *) __entry->caller_ip) |
981 | ); |
982 | |
983 | DEFINE_EVENT(transaction_event, transaction_commit, |
984 | TP_PROTO(struct btree_trans *trans, |
985 | unsigned long caller_ip), |
986 | TP_ARGS(trans, caller_ip) |
987 | ); |
988 | |
989 | DEFINE_EVENT(transaction_event, trans_restart_injected, |
990 | TP_PROTO(struct btree_trans *trans, |
991 | unsigned long caller_ip), |
992 | TP_ARGS(trans, caller_ip) |
993 | ); |
994 | |
995 | TRACE_EVENT(trans_restart_split_race, |
996 | TP_PROTO(struct btree_trans *trans, |
997 | unsigned long caller_ip, |
998 | struct btree *b), |
999 | TP_ARGS(trans, caller_ip, b), |
1000 | |
1001 | TP_STRUCT__entry( |
1002 | __array(char, trans_fn, 32 ) |
1003 | __field(unsigned long, caller_ip ) |
1004 | __field(u8, level ) |
1005 | __field(u16, written ) |
1006 | __field(u16, blocks ) |
1007 | __field(u16, u64s_remaining ) |
1008 | ), |
1009 | |
1010 | TP_fast_assign( |
1011 | strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn)); |
1012 | __entry->caller_ip = caller_ip; |
1013 | __entry->level = b->c.level; |
1014 | __entry->written = b->written; |
1015 | __entry->blocks = btree_blocks(trans->c); |
1016 | __entry->u64s_remaining = bch2_btree_keys_u64s_remaining(b); |
1017 | ), |
1018 | |
1019 | TP_printk("%s %pS l=%u written %u/%u u64s remaining %u" , |
1020 | __entry->trans_fn, (void *) __entry->caller_ip, |
1021 | __entry->level, |
1022 | __entry->written, __entry->blocks, |
1023 | __entry->u64s_remaining) |
1024 | ); |
1025 | |
1026 | DEFINE_EVENT(transaction_event, trans_blocked_journal_reclaim, |
1027 | TP_PROTO(struct btree_trans *trans, |
1028 | unsigned long caller_ip), |
1029 | TP_ARGS(trans, caller_ip) |
1030 | ); |
1031 | |
1032 | TRACE_EVENT(trans_restart_journal_preres_get, |
1033 | TP_PROTO(struct btree_trans *trans, |
1034 | unsigned long caller_ip, |
1035 | unsigned flags), |
1036 | TP_ARGS(trans, caller_ip, flags), |
1037 | |
1038 | TP_STRUCT__entry( |
1039 | __array(char, trans_fn, 32 ) |
1040 | __field(unsigned long, caller_ip ) |
1041 | __field(unsigned, flags ) |
1042 | ), |
1043 | |
1044 | TP_fast_assign( |
1045 | strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn)); |
1046 | __entry->caller_ip = caller_ip; |
1047 | __entry->flags = flags; |
1048 | ), |
1049 | |
1050 | TP_printk("%s %pS %x" , __entry->trans_fn, |
1051 | (void *) __entry->caller_ip, |
1052 | __entry->flags) |
1053 | ); |
1054 | |
1055 | DEFINE_EVENT(transaction_event, trans_restart_fault_inject, |
1056 | TP_PROTO(struct btree_trans *trans, |
1057 | unsigned long caller_ip), |
1058 | TP_ARGS(trans, caller_ip) |
1059 | ); |
1060 | |
1061 | DEFINE_EVENT(transaction_event, trans_traverse_all, |
1062 | TP_PROTO(struct btree_trans *trans, |
1063 | unsigned long caller_ip), |
1064 | TP_ARGS(trans, caller_ip) |
1065 | ); |
1066 | |
1067 | DEFINE_EVENT(transaction_event, trans_restart_key_cache_raced, |
1068 | TP_PROTO(struct btree_trans *trans, |
1069 | unsigned long caller_ip), |
1070 | TP_ARGS(trans, caller_ip) |
1071 | ); |
1072 | |
1073 | DEFINE_EVENT(trans_str, trans_restart_too_many_iters, |
1074 | TP_PROTO(struct btree_trans *trans, |
1075 | unsigned long caller_ip, |
1076 | const char *paths), |
1077 | TP_ARGS(trans, caller_ip, paths) |
1078 | ); |
1079 | |
1080 | DECLARE_EVENT_CLASS(transaction_restart_iter, |
1081 | TP_PROTO(struct btree_trans *trans, |
1082 | unsigned long caller_ip, |
1083 | struct btree_path *path), |
1084 | TP_ARGS(trans, caller_ip, path), |
1085 | |
1086 | TP_STRUCT__entry( |
1087 | __array(char, trans_fn, 32 ) |
1088 | __field(unsigned long, caller_ip ) |
1089 | __field(u8, btree_id ) |
1090 | TRACE_BPOS_entries(pos) |
1091 | ), |
1092 | |
1093 | TP_fast_assign( |
1094 | strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn)); |
1095 | __entry->caller_ip = caller_ip; |
1096 | __entry->btree_id = path->btree_id; |
1097 | TRACE_BPOS_assign(pos, path->pos) |
1098 | ), |
1099 | |
1100 | TP_printk("%s %pS btree %s pos %llu:%llu:%u" , |
1101 | __entry->trans_fn, |
1102 | (void *) __entry->caller_ip, |
1103 | bch2_btree_id_str(__entry->btree_id), |
1104 | __entry->pos_inode, |
1105 | __entry->pos_offset, |
1106 | __entry->pos_snapshot) |
1107 | ); |
1108 | |
1109 | DEFINE_EVENT(transaction_restart_iter, trans_restart_btree_node_reused, |
1110 | TP_PROTO(struct btree_trans *trans, |
1111 | unsigned long caller_ip, |
1112 | struct btree_path *path), |
1113 | TP_ARGS(trans, caller_ip, path) |
1114 | ); |
1115 | |
1116 | DEFINE_EVENT(transaction_restart_iter, trans_restart_btree_node_split, |
1117 | TP_PROTO(struct btree_trans *trans, |
1118 | unsigned long caller_ip, |
1119 | struct btree_path *path), |
1120 | TP_ARGS(trans, caller_ip, path) |
1121 | ); |
1122 | |
1123 | TRACE_EVENT(trans_restart_upgrade, |
1124 | TP_PROTO(struct btree_trans *trans, |
1125 | unsigned long caller_ip, |
1126 | struct btree_path *path, |
1127 | unsigned old_locks_want, |
1128 | unsigned new_locks_want, |
1129 | struct get_locks_fail *f), |
1130 | TP_ARGS(trans, caller_ip, path, old_locks_want, new_locks_want, f), |
1131 | |
1132 | TP_STRUCT__entry( |
1133 | __array(char, trans_fn, 32 ) |
1134 | __field(unsigned long, caller_ip ) |
1135 | __field(u8, btree_id ) |
1136 | __field(u8, old_locks_want ) |
1137 | __field(u8, new_locks_want ) |
1138 | __field(u8, level ) |
1139 | __field(u32, path_seq ) |
1140 | __field(u32, node_seq ) |
1141 | TRACE_BPOS_entries(pos) |
1142 | ), |
1143 | |
1144 | TP_fast_assign( |
1145 | strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn)); |
1146 | __entry->caller_ip = caller_ip; |
1147 | __entry->btree_id = path->btree_id; |
1148 | __entry->old_locks_want = old_locks_want; |
1149 | __entry->new_locks_want = new_locks_want; |
1150 | __entry->level = f->l; |
1151 | __entry->path_seq = path->l[f->l].lock_seq; |
1152 | __entry->node_seq = IS_ERR_OR_NULL(f->b) ? 0 : f->b->c.lock.seq; |
1153 | TRACE_BPOS_assign(pos, path->pos) |
1154 | ), |
1155 | |
1156 | TP_printk("%s %pS btree %s pos %llu:%llu:%u locks_want %u -> %u level %u path seq %u node seq %u" , |
1157 | __entry->trans_fn, |
1158 | (void *) __entry->caller_ip, |
1159 | bch2_btree_id_str(__entry->btree_id), |
1160 | __entry->pos_inode, |
1161 | __entry->pos_offset, |
1162 | __entry->pos_snapshot, |
1163 | __entry->old_locks_want, |
1164 | __entry->new_locks_want, |
1165 | __entry->level, |
1166 | __entry->path_seq, |
1167 | __entry->node_seq) |
1168 | ); |
1169 | |
1170 | DEFINE_EVENT(trans_str, trans_restart_relock, |
1171 | TP_PROTO(struct btree_trans *trans, unsigned long caller_ip, const char *str), |
1172 | TP_ARGS(trans, caller_ip, str) |
1173 | ); |
1174 | |
1175 | DEFINE_EVENT(transaction_restart_iter, trans_restart_relock_next_node, |
1176 | TP_PROTO(struct btree_trans *trans, |
1177 | unsigned long caller_ip, |
1178 | struct btree_path *path), |
1179 | TP_ARGS(trans, caller_ip, path) |
1180 | ); |
1181 | |
1182 | DEFINE_EVENT(transaction_restart_iter, trans_restart_relock_parent_for_fill, |
1183 | TP_PROTO(struct btree_trans *trans, |
1184 | unsigned long caller_ip, |
1185 | struct btree_path *path), |
1186 | TP_ARGS(trans, caller_ip, path) |
1187 | ); |
1188 | |
1189 | DEFINE_EVENT(transaction_restart_iter, trans_restart_relock_after_fill, |
1190 | TP_PROTO(struct btree_trans *trans, |
1191 | unsigned long caller_ip, |
1192 | struct btree_path *path), |
1193 | TP_ARGS(trans, caller_ip, path) |
1194 | ); |
1195 | |
1196 | DEFINE_EVENT(transaction_event, trans_restart_key_cache_upgrade, |
1197 | TP_PROTO(struct btree_trans *trans, |
1198 | unsigned long caller_ip), |
1199 | TP_ARGS(trans, caller_ip) |
1200 | ); |
1201 | |
1202 | DEFINE_EVENT(transaction_restart_iter, trans_restart_relock_key_cache_fill, |
1203 | TP_PROTO(struct btree_trans *trans, |
1204 | unsigned long caller_ip, |
1205 | struct btree_path *path), |
1206 | TP_ARGS(trans, caller_ip, path) |
1207 | ); |
1208 | |
1209 | DEFINE_EVENT(transaction_restart_iter, trans_restart_relock_path, |
1210 | TP_PROTO(struct btree_trans *trans, |
1211 | unsigned long caller_ip, |
1212 | struct btree_path *path), |
1213 | TP_ARGS(trans, caller_ip, path) |
1214 | ); |
1215 | |
1216 | DEFINE_EVENT(transaction_restart_iter, trans_restart_relock_path_intent, |
1217 | TP_PROTO(struct btree_trans *trans, |
1218 | unsigned long caller_ip, |
1219 | struct btree_path *path), |
1220 | TP_ARGS(trans, caller_ip, path) |
1221 | ); |
1222 | |
1223 | DEFINE_EVENT(transaction_restart_iter, trans_restart_traverse, |
1224 | TP_PROTO(struct btree_trans *trans, |
1225 | unsigned long caller_ip, |
1226 | struct btree_path *path), |
1227 | TP_ARGS(trans, caller_ip, path) |
1228 | ); |
1229 | |
1230 | DEFINE_EVENT(transaction_restart_iter, trans_restart_memory_allocation_failure, |
1231 | TP_PROTO(struct btree_trans *trans, |
1232 | unsigned long caller_ip, |
1233 | struct btree_path *path), |
1234 | TP_ARGS(trans, caller_ip, path) |
1235 | ); |
1236 | |
1237 | DEFINE_EVENT(trans_str_nocaller, trans_restart_would_deadlock, |
1238 | TP_PROTO(struct btree_trans *trans, |
1239 | const char *cycle), |
1240 | TP_ARGS(trans, cycle) |
1241 | ); |
1242 | |
1243 | DEFINE_EVENT(transaction_event, trans_restart_would_deadlock_recursion_limit, |
1244 | TP_PROTO(struct btree_trans *trans, |
1245 | unsigned long caller_ip), |
1246 | TP_ARGS(trans, caller_ip) |
1247 | ); |
1248 | |
1249 | TRACE_EVENT(trans_restart_would_deadlock_write, |
1250 | TP_PROTO(struct btree_trans *trans), |
1251 | TP_ARGS(trans), |
1252 | |
1253 | TP_STRUCT__entry( |
1254 | __array(char, trans_fn, 32 ) |
1255 | ), |
1256 | |
1257 | TP_fast_assign( |
1258 | strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn)); |
1259 | ), |
1260 | |
1261 | TP_printk("%s" , __entry->trans_fn) |
1262 | ); |
1263 | |
1264 | TRACE_EVENT(trans_restart_mem_realloced, |
1265 | TP_PROTO(struct btree_trans *trans, |
1266 | unsigned long caller_ip, |
1267 | unsigned long bytes), |
1268 | TP_ARGS(trans, caller_ip, bytes), |
1269 | |
1270 | TP_STRUCT__entry( |
1271 | __array(char, trans_fn, 32 ) |
1272 | __field(unsigned long, caller_ip ) |
1273 | __field(unsigned long, bytes ) |
1274 | ), |
1275 | |
1276 | TP_fast_assign( |
1277 | strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn)); |
1278 | __entry->caller_ip = caller_ip; |
1279 | __entry->bytes = bytes; |
1280 | ), |
1281 | |
1282 | TP_printk("%s %pS bytes %lu" , |
1283 | __entry->trans_fn, |
1284 | (void *) __entry->caller_ip, |
1285 | __entry->bytes) |
1286 | ); |
1287 | |
1288 | TRACE_EVENT(trans_restart_key_cache_key_realloced, |
1289 | TP_PROTO(struct btree_trans *trans, |
1290 | unsigned long caller_ip, |
1291 | struct btree_path *path, |
1292 | unsigned old_u64s, |
1293 | unsigned new_u64s), |
1294 | TP_ARGS(trans, caller_ip, path, old_u64s, new_u64s), |
1295 | |
1296 | TP_STRUCT__entry( |
1297 | __array(char, trans_fn, 32 ) |
1298 | __field(unsigned long, caller_ip ) |
1299 | __field(enum btree_id, btree_id ) |
1300 | TRACE_BPOS_entries(pos) |
1301 | __field(u32, old_u64s ) |
1302 | __field(u32, new_u64s ) |
1303 | ), |
1304 | |
1305 | TP_fast_assign( |
1306 | strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn)); |
1307 | __entry->caller_ip = caller_ip; |
1308 | |
1309 | __entry->btree_id = path->btree_id; |
1310 | TRACE_BPOS_assign(pos, path->pos); |
1311 | __entry->old_u64s = old_u64s; |
1312 | __entry->new_u64s = new_u64s; |
1313 | ), |
1314 | |
1315 | TP_printk("%s %pS btree %s pos %llu:%llu:%u old_u64s %u new_u64s %u" , |
1316 | __entry->trans_fn, |
1317 | (void *) __entry->caller_ip, |
1318 | bch2_btree_id_str(__entry->btree_id), |
1319 | __entry->pos_inode, |
1320 | __entry->pos_offset, |
1321 | __entry->pos_snapshot, |
1322 | __entry->old_u64s, |
1323 | __entry->new_u64s) |
1324 | ); |
1325 | |
1326 | TRACE_EVENT(path_downgrade, |
1327 | TP_PROTO(struct btree_trans *trans, |
1328 | unsigned long caller_ip, |
1329 | struct btree_path *path, |
1330 | unsigned old_locks_want), |
1331 | TP_ARGS(trans, caller_ip, path, old_locks_want), |
1332 | |
1333 | TP_STRUCT__entry( |
1334 | __array(char, trans_fn, 32 ) |
1335 | __field(unsigned long, caller_ip ) |
1336 | __field(unsigned, old_locks_want ) |
1337 | __field(unsigned, new_locks_want ) |
1338 | __field(unsigned, btree ) |
1339 | TRACE_BPOS_entries(pos) |
1340 | ), |
1341 | |
1342 | TP_fast_assign( |
1343 | strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn)); |
1344 | __entry->caller_ip = caller_ip; |
1345 | __entry->old_locks_want = old_locks_want; |
1346 | __entry->new_locks_want = path->locks_want; |
1347 | __entry->btree = path->btree_id; |
1348 | TRACE_BPOS_assign(pos, path->pos); |
1349 | ), |
1350 | |
1351 | TP_printk("%s %pS locks_want %u -> %u %s %llu:%llu:%u" , |
1352 | __entry->trans_fn, |
1353 | (void *) __entry->caller_ip, |
1354 | __entry->old_locks_want, |
1355 | __entry->new_locks_want, |
1356 | bch2_btree_id_str(__entry->btree), |
1357 | __entry->pos_inode, |
1358 | __entry->pos_offset, |
1359 | __entry->pos_snapshot) |
1360 | ); |
1361 | |
1362 | DEFINE_EVENT(transaction_event, trans_restart_write_buffer_flush, |
1363 | TP_PROTO(struct btree_trans *trans, |
1364 | unsigned long caller_ip), |
1365 | TP_ARGS(trans, caller_ip) |
1366 | ); |
1367 | |
1368 | TRACE_EVENT(write_buffer_flush, |
1369 | TP_PROTO(struct btree_trans *trans, size_t nr, size_t skipped, size_t fast, size_t size), |
1370 | TP_ARGS(trans, nr, skipped, fast, size), |
1371 | |
1372 | TP_STRUCT__entry( |
1373 | __field(size_t, nr ) |
1374 | __field(size_t, skipped ) |
1375 | __field(size_t, fast ) |
1376 | __field(size_t, size ) |
1377 | ), |
1378 | |
1379 | TP_fast_assign( |
1380 | __entry->nr = nr; |
1381 | __entry->skipped = skipped; |
1382 | __entry->fast = fast; |
1383 | __entry->size = size; |
1384 | ), |
1385 | |
1386 | TP_printk("%zu/%zu skipped %zu fast %zu" , |
1387 | __entry->nr, __entry->size, __entry->skipped, __entry->fast) |
1388 | ); |
1389 | |
1390 | TRACE_EVENT(write_buffer_flush_sync, |
1391 | TP_PROTO(struct btree_trans *trans, unsigned long caller_ip), |
1392 | TP_ARGS(trans, caller_ip), |
1393 | |
1394 | TP_STRUCT__entry( |
1395 | __array(char, trans_fn, 32 ) |
1396 | __field(unsigned long, caller_ip ) |
1397 | ), |
1398 | |
1399 | TP_fast_assign( |
1400 | strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn)); |
1401 | __entry->caller_ip = caller_ip; |
1402 | ), |
1403 | |
1404 | TP_printk("%s %pS" , __entry->trans_fn, (void *) __entry->caller_ip) |
1405 | ); |
1406 | |
1407 | TRACE_EVENT(write_buffer_flush_slowpath, |
1408 | TP_PROTO(struct btree_trans *trans, size_t slowpath, size_t total), |
1409 | TP_ARGS(trans, slowpath, total), |
1410 | |
1411 | TP_STRUCT__entry( |
1412 | __field(size_t, slowpath ) |
1413 | __field(size_t, total ) |
1414 | ), |
1415 | |
1416 | TP_fast_assign( |
1417 | __entry->slowpath = slowpath; |
1418 | __entry->total = total; |
1419 | ), |
1420 | |
1421 | TP_printk("%zu/%zu" , __entry->slowpath, __entry->total) |
1422 | ); |
1423 | |
1424 | DEFINE_EVENT(fs_str, rebalance_extent, |
1425 | TP_PROTO(struct bch_fs *c, const char *str), |
1426 | TP_ARGS(c, str) |
1427 | ); |
1428 | |
1429 | DEFINE_EVENT(fs_str, data_update, |
1430 | TP_PROTO(struct bch_fs *c, const char *str), |
1431 | TP_ARGS(c, str) |
1432 | ); |
1433 | |
1434 | TRACE_EVENT(error_downcast, |
1435 | TP_PROTO(int bch_err, int std_err, unsigned long ip), |
1436 | TP_ARGS(bch_err, std_err, ip), |
1437 | |
1438 | TP_STRUCT__entry( |
1439 | __array(char, bch_err, 32 ) |
1440 | __array(char, std_err, 32 ) |
1441 | __array(char, ip, 32 ) |
1442 | ), |
1443 | |
1444 | TP_fast_assign( |
1445 | strscpy(__entry->bch_err, bch2_err_str(bch_err), sizeof(__entry->bch_err)); |
1446 | strscpy(__entry->std_err, bch2_err_str(std_err), sizeof(__entry->std_err)); |
1447 | snprintf(__entry->ip, sizeof(__entry->ip), "%ps" , (void *) ip); |
1448 | ), |
1449 | |
1450 | TP_printk("%s -> %s %s" , __entry->bch_err, __entry->std_err, __entry->ip) |
1451 | ); |
1452 | |
1453 | #endif /* _TRACE_BCACHEFS_H */ |
1454 | |
1455 | /* This part must be outside protection */ |
1456 | #undef TRACE_INCLUDE_PATH |
1457 | #define TRACE_INCLUDE_PATH ../../fs/bcachefs |
1458 | |
1459 | #undef TRACE_INCLUDE_FILE |
1460 | #define TRACE_INCLUDE_FILE trace |
1461 | |
1462 | #include <trace/define_trace.h> |
1463 | |