Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/include/trace/events/bcache.h
26285 views
1
/* SPDX-License-Identifier: GPL-2.0 */
2
#undef TRACE_SYSTEM
3
#define TRACE_SYSTEM bcache
4
5
#if !defined(_TRACE_BCACHE_H) || defined(TRACE_HEADER_MULTI_READ)
6
#define _TRACE_BCACHE_H
7
8
#include <linux/tracepoint.h>
9
10
DECLARE_EVENT_CLASS(bcache_request,
11
TP_PROTO(struct bcache_device *d, struct bio *bio),
12
TP_ARGS(d, bio),
13
14
TP_STRUCT__entry(
15
__field(dev_t, dev )
16
__field(unsigned int, orig_major )
17
__field(unsigned int, orig_minor )
18
__field(sector_t, sector )
19
__field(dev_t, orig_sector )
20
__field(unsigned int, nr_sector )
21
__array(char, rwbs, 6 )
22
),
23
24
TP_fast_assign(
25
__entry->dev = bio_dev(bio);
26
__entry->orig_major = d->disk->major;
27
__entry->orig_minor = d->disk->first_minor;
28
__entry->sector = bio->bi_iter.bi_sector;
29
__entry->orig_sector = bio->bi_iter.bi_sector - 16;
30
__entry->nr_sector = bio->bi_iter.bi_size >> 9;
31
blk_fill_rwbs(__entry->rwbs, bio->bi_opf);
32
),
33
34
TP_printk("%d,%d %s %llu + %u (from %d,%d @ %llu)",
35
MAJOR(__entry->dev), MINOR(__entry->dev),
36
__entry->rwbs, (unsigned long long)__entry->sector,
37
__entry->nr_sector, __entry->orig_major, __entry->orig_minor,
38
(unsigned long long)__entry->orig_sector)
39
);
40
41
DECLARE_EVENT_CLASS(bkey,
42
TP_PROTO(struct bkey *k),
43
TP_ARGS(k),
44
45
TP_STRUCT__entry(
46
__field(u32, size )
47
__field(u32, inode )
48
__field(u64, offset )
49
__field(bool, dirty )
50
),
51
52
TP_fast_assign(
53
__entry->inode = KEY_INODE(k);
54
__entry->offset = KEY_OFFSET(k);
55
__entry->size = KEY_SIZE(k);
56
__entry->dirty = KEY_DIRTY(k);
57
),
58
59
TP_printk("%u:%llu len %u dirty %u", __entry->inode,
60
__entry->offset, __entry->size, __entry->dirty)
61
);
62
63
DECLARE_EVENT_CLASS(btree_node,
64
TP_PROTO(struct btree *b),
65
TP_ARGS(b),
66
67
TP_STRUCT__entry(
68
__field(size_t, bucket )
69
),
70
71
TP_fast_assign(
72
__entry->bucket = PTR_BUCKET_NR(b->c, &b->key, 0);
73
),
74
75
TP_printk("bucket %zu", __entry->bucket)
76
);
77
78
/* request.c */
79
80
DEFINE_EVENT(bcache_request, bcache_request_start,
81
TP_PROTO(struct bcache_device *d, struct bio *bio),
82
TP_ARGS(d, bio)
83
);
84
85
DEFINE_EVENT(bcache_request, bcache_request_end,
86
TP_PROTO(struct bcache_device *d, struct bio *bio),
87
TP_ARGS(d, bio)
88
);
89
90
DECLARE_EVENT_CLASS(bcache_bio,
91
TP_PROTO(struct bio *bio),
92
TP_ARGS(bio),
93
94
TP_STRUCT__entry(
95
__field(dev_t, dev )
96
__field(sector_t, sector )
97
__field(unsigned int, nr_sector )
98
__array(char, rwbs, 6 )
99
),
100
101
TP_fast_assign(
102
__entry->dev = bio_dev(bio);
103
__entry->sector = bio->bi_iter.bi_sector;
104
__entry->nr_sector = bio->bi_iter.bi_size >> 9;
105
blk_fill_rwbs(__entry->rwbs, bio->bi_opf);
106
),
107
108
TP_printk("%d,%d %s %llu + %u",
109
MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs,
110
(unsigned long long)__entry->sector, __entry->nr_sector)
111
);
112
113
DEFINE_EVENT(bcache_bio, bcache_bypass_sequential,
114
TP_PROTO(struct bio *bio),
115
TP_ARGS(bio)
116
);
117
118
DEFINE_EVENT(bcache_bio, bcache_bypass_congested,
119
TP_PROTO(struct bio *bio),
120
TP_ARGS(bio)
121
);
122
123
TRACE_EVENT(bcache_read,
124
TP_PROTO(struct bio *bio, bool hit, bool bypass),
125
TP_ARGS(bio, hit, bypass),
126
127
TP_STRUCT__entry(
128
__field(dev_t, dev )
129
__field(sector_t, sector )
130
__field(unsigned int, nr_sector )
131
__array(char, rwbs, 6 )
132
__field(bool, cache_hit )
133
__field(bool, bypass )
134
),
135
136
TP_fast_assign(
137
__entry->dev = bio_dev(bio);
138
__entry->sector = bio->bi_iter.bi_sector;
139
__entry->nr_sector = bio->bi_iter.bi_size >> 9;
140
blk_fill_rwbs(__entry->rwbs, bio->bi_opf);
141
__entry->cache_hit = hit;
142
__entry->bypass = bypass;
143
),
144
145
TP_printk("%d,%d %s %llu + %u hit %u bypass %u",
146
MAJOR(__entry->dev), MINOR(__entry->dev),
147
__entry->rwbs, (unsigned long long)__entry->sector,
148
__entry->nr_sector, __entry->cache_hit, __entry->bypass)
149
);
150
151
TRACE_EVENT(bcache_write,
152
TP_PROTO(struct cache_set *c, u64 inode, struct bio *bio,
153
bool writeback, bool bypass),
154
TP_ARGS(c, inode, bio, writeback, bypass),
155
156
TP_STRUCT__entry(
157
__array(char, uuid, 16 )
158
__field(u64, inode )
159
__field(sector_t, sector )
160
__field(unsigned int, nr_sector )
161
__array(char, rwbs, 6 )
162
__field(bool, writeback )
163
__field(bool, bypass )
164
),
165
166
TP_fast_assign(
167
memcpy(__entry->uuid, c->set_uuid, 16);
168
__entry->inode = inode;
169
__entry->sector = bio->bi_iter.bi_sector;
170
__entry->nr_sector = bio->bi_iter.bi_size >> 9;
171
blk_fill_rwbs(__entry->rwbs, bio->bi_opf);
172
__entry->writeback = writeback;
173
__entry->bypass = bypass;
174
),
175
176
TP_printk("%pU inode %llu %s %llu + %u hit %u bypass %u",
177
__entry->uuid, __entry->inode,
178
__entry->rwbs, (unsigned long long)__entry->sector,
179
__entry->nr_sector, __entry->writeback, __entry->bypass)
180
);
181
182
DEFINE_EVENT(bcache_bio, bcache_read_retry,
183
TP_PROTO(struct bio *bio),
184
TP_ARGS(bio)
185
);
186
187
DEFINE_EVENT(bkey, bcache_cache_insert,
188
TP_PROTO(struct bkey *k),
189
TP_ARGS(k)
190
);
191
192
/* Journal */
193
194
DECLARE_EVENT_CLASS(cache_set,
195
TP_PROTO(struct cache_set *c),
196
TP_ARGS(c),
197
198
TP_STRUCT__entry(
199
__array(char, uuid, 16 )
200
),
201
202
TP_fast_assign(
203
memcpy(__entry->uuid, c->set_uuid, 16);
204
),
205
206
TP_printk("%pU", __entry->uuid)
207
);
208
209
DEFINE_EVENT(bkey, bcache_journal_replay_key,
210
TP_PROTO(struct bkey *k),
211
TP_ARGS(k)
212
);
213
214
DEFINE_EVENT(cache_set, bcache_journal_full,
215
TP_PROTO(struct cache_set *c),
216
TP_ARGS(c)
217
);
218
219
DEFINE_EVENT(cache_set, bcache_journal_entry_full,
220
TP_PROTO(struct cache_set *c),
221
TP_ARGS(c)
222
);
223
224
TRACE_EVENT(bcache_journal_write,
225
TP_PROTO(struct bio *bio, u32 keys),
226
TP_ARGS(bio, keys),
227
228
TP_STRUCT__entry(
229
__field(dev_t, dev )
230
__field(sector_t, sector )
231
__field(unsigned int, nr_sector )
232
__array(char, rwbs, 6 )
233
__field(u32, nr_keys )
234
),
235
236
TP_fast_assign(
237
__entry->dev = bio_dev(bio);
238
__entry->sector = bio->bi_iter.bi_sector;
239
__entry->nr_sector = bio->bi_iter.bi_size >> 9;
240
__entry->nr_keys = keys;
241
blk_fill_rwbs(__entry->rwbs, bio->bi_opf);
242
),
243
244
TP_printk("%d,%d %s %llu + %u keys %u",
245
MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs,
246
(unsigned long long)__entry->sector, __entry->nr_sector,
247
__entry->nr_keys)
248
);
249
250
/* Btree */
251
252
DEFINE_EVENT(cache_set, bcache_btree_cache_cannibalize,
253
TP_PROTO(struct cache_set *c),
254
TP_ARGS(c)
255
);
256
257
DEFINE_EVENT(btree_node, bcache_btree_read,
258
TP_PROTO(struct btree *b),
259
TP_ARGS(b)
260
);
261
262
TRACE_EVENT(bcache_btree_write,
263
TP_PROTO(struct btree *b),
264
TP_ARGS(b),
265
266
TP_STRUCT__entry(
267
__field(size_t, bucket )
268
__field(unsigned, block )
269
__field(unsigned, keys )
270
),
271
272
TP_fast_assign(
273
__entry->bucket = PTR_BUCKET_NR(b->c, &b->key, 0);
274
__entry->block = b->written;
275
__entry->keys = b->keys.set[b->keys.nsets].data->keys;
276
),
277
278
TP_printk("bucket %zu written block %u + %u",
279
__entry->bucket, __entry->block, __entry->keys)
280
);
281
282
DEFINE_EVENT(btree_node, bcache_btree_node_alloc,
283
TP_PROTO(struct btree *b),
284
TP_ARGS(b)
285
);
286
287
DEFINE_EVENT(cache_set, bcache_btree_node_alloc_fail,
288
TP_PROTO(struct cache_set *c),
289
TP_ARGS(c)
290
);
291
292
DEFINE_EVENT(btree_node, bcache_btree_node_free,
293
TP_PROTO(struct btree *b),
294
TP_ARGS(b)
295
);
296
297
TRACE_EVENT(bcache_btree_gc_coalesce,
298
TP_PROTO(unsigned nodes),
299
TP_ARGS(nodes),
300
301
TP_STRUCT__entry(
302
__field(unsigned, nodes )
303
),
304
305
TP_fast_assign(
306
__entry->nodes = nodes;
307
),
308
309
TP_printk("coalesced %u nodes", __entry->nodes)
310
);
311
312
DEFINE_EVENT(cache_set, bcache_gc_start,
313
TP_PROTO(struct cache_set *c),
314
TP_ARGS(c)
315
);
316
317
DEFINE_EVENT(cache_set, bcache_gc_end,
318
TP_PROTO(struct cache_set *c),
319
TP_ARGS(c)
320
);
321
322
DEFINE_EVENT(bkey, bcache_gc_copy,
323
TP_PROTO(struct bkey *k),
324
TP_ARGS(k)
325
);
326
327
DEFINE_EVENT(bkey, bcache_gc_copy_collision,
328
TP_PROTO(struct bkey *k),
329
TP_ARGS(k)
330
);
331
332
TRACE_EVENT(bcache_btree_insert_key,
333
TP_PROTO(struct btree *b, struct bkey *k, unsigned op, unsigned status),
334
TP_ARGS(b, k, op, status),
335
336
TP_STRUCT__entry(
337
__field(u64, btree_node )
338
__field(u32, btree_level )
339
__field(u32, inode )
340
__field(u64, offset )
341
__field(u32, size )
342
__field(u8, dirty )
343
__field(u8, op )
344
__field(u8, status )
345
),
346
347
TP_fast_assign(
348
__entry->btree_node = PTR_BUCKET_NR(b->c, &b->key, 0);
349
__entry->btree_level = b->level;
350
__entry->inode = KEY_INODE(k);
351
__entry->offset = KEY_OFFSET(k);
352
__entry->size = KEY_SIZE(k);
353
__entry->dirty = KEY_DIRTY(k);
354
__entry->op = op;
355
__entry->status = status;
356
),
357
358
TP_printk("%u for %u at %llu(%u): %u:%llu len %u dirty %u",
359
__entry->status, __entry->op,
360
__entry->btree_node, __entry->btree_level,
361
__entry->inode, __entry->offset,
362
__entry->size, __entry->dirty)
363
);
364
365
DECLARE_EVENT_CLASS(btree_split,
366
TP_PROTO(struct btree *b, unsigned keys),
367
TP_ARGS(b, keys),
368
369
TP_STRUCT__entry(
370
__field(size_t, bucket )
371
__field(unsigned, keys )
372
),
373
374
TP_fast_assign(
375
__entry->bucket = PTR_BUCKET_NR(b->c, &b->key, 0);
376
__entry->keys = keys;
377
),
378
379
TP_printk("bucket %zu keys %u", __entry->bucket, __entry->keys)
380
);
381
382
DEFINE_EVENT(btree_split, bcache_btree_node_split,
383
TP_PROTO(struct btree *b, unsigned keys),
384
TP_ARGS(b, keys)
385
);
386
387
DEFINE_EVENT(btree_split, bcache_btree_node_compact,
388
TP_PROTO(struct btree *b, unsigned keys),
389
TP_ARGS(b, keys)
390
);
391
392
DEFINE_EVENT(btree_node, bcache_btree_set_root,
393
TP_PROTO(struct btree *b),
394
TP_ARGS(b)
395
);
396
397
TRACE_EVENT(bcache_keyscan,
398
TP_PROTO(unsigned nr_found,
399
unsigned start_inode, uint64_t start_offset,
400
unsigned end_inode, uint64_t end_offset),
401
TP_ARGS(nr_found,
402
start_inode, start_offset,
403
end_inode, end_offset),
404
405
TP_STRUCT__entry(
406
__field(__u32, nr_found )
407
__field(__u32, start_inode )
408
__field(__u64, start_offset )
409
__field(__u32, end_inode )
410
__field(__u64, end_offset )
411
),
412
413
TP_fast_assign(
414
__entry->nr_found = nr_found;
415
__entry->start_inode = start_inode;
416
__entry->start_offset = start_offset;
417
__entry->end_inode = end_inode;
418
__entry->end_offset = end_offset;
419
),
420
421
TP_printk("found %u keys from %u:%llu to %u:%llu", __entry->nr_found,
422
__entry->start_inode, __entry->start_offset,
423
__entry->end_inode, __entry->end_offset)
424
);
425
426
/* Allocator */
427
428
TRACE_EVENT(bcache_invalidate,
429
TP_PROTO(struct cache *ca, size_t bucket),
430
TP_ARGS(ca, bucket),
431
432
TP_STRUCT__entry(
433
__field(unsigned, sectors )
434
__field(dev_t, dev )
435
__field(__u64, offset )
436
),
437
438
TP_fast_assign(
439
__entry->dev = ca->bdev->bd_dev;
440
__entry->offset = bucket << ca->set->bucket_bits;
441
__entry->sectors = GC_SECTORS_USED(&ca->buckets[bucket]);
442
),
443
444
TP_printk("invalidated %u sectors at %d,%d sector=%llu",
445
__entry->sectors, MAJOR(__entry->dev),
446
MINOR(__entry->dev), __entry->offset)
447
);
448
449
TRACE_EVENT(bcache_alloc,
450
TP_PROTO(struct cache *ca, size_t bucket),
451
TP_ARGS(ca, bucket),
452
453
TP_STRUCT__entry(
454
__field(dev_t, dev )
455
__field(__u64, offset )
456
),
457
458
TP_fast_assign(
459
__entry->dev = ca->bdev->bd_dev;
460
__entry->offset = bucket << ca->set->bucket_bits;
461
),
462
463
TP_printk("allocated %d,%d sector=%llu", MAJOR(__entry->dev),
464
MINOR(__entry->dev), __entry->offset)
465
);
466
467
TRACE_EVENT(bcache_alloc_fail,
468
TP_PROTO(struct cache *ca, unsigned reserve),
469
TP_ARGS(ca, reserve),
470
471
TP_STRUCT__entry(
472
__field(dev_t, dev )
473
__field(unsigned, free )
474
__field(unsigned, free_inc )
475
__field(unsigned, blocked )
476
),
477
478
TP_fast_assign(
479
__entry->dev = ca->bdev->bd_dev;
480
__entry->free = fifo_used(&ca->free[reserve]);
481
__entry->free_inc = fifo_used(&ca->free_inc);
482
__entry->blocked = atomic_read(&ca->set->prio_blocked);
483
),
484
485
TP_printk("alloc fail %d,%d free %u free_inc %u blocked %u",
486
MAJOR(__entry->dev), MINOR(__entry->dev), __entry->free,
487
__entry->free_inc, __entry->blocked)
488
);
489
490
/* Background writeback */
491
492
DEFINE_EVENT(bkey, bcache_writeback,
493
TP_PROTO(struct bkey *k),
494
TP_ARGS(k)
495
);
496
497
DEFINE_EVENT(bkey, bcache_writeback_collision,
498
TP_PROTO(struct bkey *k),
499
TP_ARGS(k)
500
);
501
502
#endif /* _TRACE_BCACHE_H */
503
504
/* This part must be outside protection */
505
#include <trace/define_trace.h>
506
507