bcache.h 10.9 KB
Newer Older
K
Kent Overstreet 已提交
1 2 3 4 5 6 7 8 9
#undef TRACE_SYSTEM
#define TRACE_SYSTEM bcache

#if !defined(_TRACE_BCACHE_H) || defined(TRACE_HEADER_MULTI_READ)
#define _TRACE_BCACHE_H

#include <linux/tracepoint.h>

DECLARE_EVENT_CLASS(bcache_request,
K
Kent Overstreet 已提交
10 11
	TP_PROTO(struct bcache_device *d, struct bio *bio),
	TP_ARGS(d, bio),
K
Kent Overstreet 已提交
12 13 14 15 16 17 18 19 20 21 22 23 24

	TP_STRUCT__entry(
		__field(dev_t,		dev			)
		__field(unsigned int,	orig_major		)
		__field(unsigned int,	orig_minor		)
		__field(sector_t,	sector			)
		__field(dev_t,		orig_sector		)
		__field(unsigned int,	nr_sector		)
		__array(char,		rwbs,	6		)
	),

	TP_fast_assign(
		__entry->dev		= bio->bi_bdev->bd_dev;
K
Kent Overstreet 已提交
25 26
		__entry->orig_major	= d->disk->major;
		__entry->orig_minor	= d->disk->first_minor;
27 28 29 30
		__entry->sector		= bio->bi_iter.bi_sector;
		__entry->orig_sector	= bio->bi_iter.bi_sector - 16;
		__entry->nr_sector	= bio->bi_iter.bi_size >> 9;
		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size);
K
Kent Overstreet 已提交
31 32
	),

K
Kent Overstreet 已提交
33
	TP_printk("%d,%d %s %llu + %u (from %d,%d @ %llu)",
K
Kent Overstreet 已提交
34
		  MAJOR(__entry->dev), MINOR(__entry->dev),
K
Kent Overstreet 已提交
35 36
		  __entry->rwbs, (unsigned long long)__entry->sector,
		  __entry->nr_sector, __entry->orig_major, __entry->orig_minor,
K
Kent Overstreet 已提交
37 38 39
		  (unsigned long long)__entry->orig_sector)
);

K
Kent Overstreet 已提交
40 41 42
DECLARE_EVENT_CLASS(bkey,
	TP_PROTO(struct bkey *k),
	TP_ARGS(k),
K
Kent Overstreet 已提交
43

K
Kent Overstreet 已提交
44 45 46 47 48 49
	TP_STRUCT__entry(
		__field(u32,	size				)
		__field(u32,	inode				)
		__field(u64,	offset				)
		__field(bool,	dirty				)
	),
K
Kent Overstreet 已提交
50

K
Kent Overstreet 已提交
51 52 53 54 55 56 57 58 59
	TP_fast_assign(
		__entry->inode	= KEY_INODE(k);
		__entry->offset	= KEY_OFFSET(k);
		__entry->size	= KEY_SIZE(k);
		__entry->dirty	= KEY_DIRTY(k);
	),

	TP_printk("%u:%llu len %u dirty %u", __entry->inode,
		  __entry->offset, __entry->size, __entry->dirty)
K
Kent Overstreet 已提交
60 61
);

K
Kent Overstreet 已提交
62 63 64 65 66 67 68 69 70 71 72
DECLARE_EVENT_CLASS(btree_node,
	TP_PROTO(struct btree *b),
	TP_ARGS(b),

	TP_STRUCT__entry(
		__field(size_t,		bucket			)
	),

	TP_fast_assign(
		__entry->bucket	= PTR_BUCKET_NR(b->c, &b->key, 0);
	),
K
Kent Overstreet 已提交
73

K
Kent Overstreet 已提交
74 75 76 77 78 79
	TP_printk("bucket %zu", __entry->bucket)
);

/* request.c */

DEFINE_EVENT(bcache_request, bcache_request_start,
K
Kent Overstreet 已提交
80 81
	TP_PROTO(struct bcache_device *d, struct bio *bio),
	TP_ARGS(d, bio)
K
Kent Overstreet 已提交
82
);
K
Kent Overstreet 已提交
83

K
Kent Overstreet 已提交
84
DEFINE_EVENT(bcache_request, bcache_request_end,
K
Kent Overstreet 已提交
85 86
	TP_PROTO(struct bcache_device *d, struct bio *bio),
	TP_ARGS(d, bio)
K
Kent Overstreet 已提交
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
);

DECLARE_EVENT_CLASS(bcache_bio,
	TP_PROTO(struct bio *bio),
	TP_ARGS(bio),

	TP_STRUCT__entry(
		__field(dev_t,		dev			)
		__field(sector_t,	sector			)
		__field(unsigned int,	nr_sector		)
		__array(char,		rwbs,	6		)
	),

	TP_fast_assign(
		__entry->dev		= bio->bi_bdev->bd_dev;
102 103 104
		__entry->sector		= bio->bi_iter.bi_sector;
		__entry->nr_sector	= bio->bi_iter.bi_size >> 9;
		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size);
K
Kent Overstreet 已提交
105 106
	),

K
Kent Overstreet 已提交
107 108 109
	TP_printk("%d,%d  %s %llu + %u",
		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs,
		  (unsigned long long)__entry->sector, __entry->nr_sector)
K
Kent Overstreet 已提交
110 111
);

K
Kent Overstreet 已提交
112
DEFINE_EVENT(bcache_bio, bcache_bypass_sequential,
K
Kent Overstreet 已提交
113 114 115 116
	TP_PROTO(struct bio *bio),
	TP_ARGS(bio)
);

K
Kent Overstreet 已提交
117
DEFINE_EVENT(bcache_bio, bcache_bypass_congested,
K
Kent Overstreet 已提交
118 119 120 121
	TP_PROTO(struct bio *bio),
	TP_ARGS(bio)
);

K
Kent Overstreet 已提交
122 123 124
TRACE_EVENT(bcache_read,
	TP_PROTO(struct bio *bio, bool hit, bool bypass),
	TP_ARGS(bio, hit, bypass),
K
Kent Overstreet 已提交
125

K
Kent Overstreet 已提交
126 127 128 129 130 131 132 133
	TP_STRUCT__entry(
		__field(dev_t,		dev			)
		__field(sector_t,	sector			)
		__field(unsigned int,	nr_sector		)
		__array(char,		rwbs,	6		)
		__field(bool,		cache_hit		)
		__field(bool,		bypass			)
	),
K
Kent Overstreet 已提交
134

K
Kent Overstreet 已提交
135 136
	TP_fast_assign(
		__entry->dev		= bio->bi_bdev->bd_dev;
137 138 139
		__entry->sector		= bio->bi_iter.bi_sector;
		__entry->nr_sector	= bio->bi_iter.bi_size >> 9;
		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size);
K
Kent Overstreet 已提交
140 141 142 143 144 145 146 147
		__entry->cache_hit = hit;
		__entry->bypass = bypass;
	),

	TP_printk("%d,%d  %s %llu + %u hit %u bypass %u",
		  MAJOR(__entry->dev), MINOR(__entry->dev),
		  __entry->rwbs, (unsigned long long)__entry->sector,
		  __entry->nr_sector, __entry->cache_hit, __entry->bypass)
K
Kent Overstreet 已提交
148 149
);

K
Kent Overstreet 已提交
150
TRACE_EVENT(bcache_write,
151 152 153
	TP_PROTO(struct cache_set *c, u64 inode, struct bio *bio,
		bool writeback, bool bypass),
	TP_ARGS(c, inode, bio, writeback, bypass),
K
Kent Overstreet 已提交
154

K
Kent Overstreet 已提交
155
	TP_STRUCT__entry(
156 157
		__array(char,		uuid,	16		)
		__field(u64,		inode			)
K
Kent Overstreet 已提交
158 159 160 161 162 163
		__field(sector_t,	sector			)
		__field(unsigned int,	nr_sector		)
		__array(char,		rwbs,	6		)
		__field(bool,		writeback		)
		__field(bool,		bypass			)
	),
K
Kent Overstreet 已提交
164

K
Kent Overstreet 已提交
165
	TP_fast_assign(
166 167
		memcpy(__entry->uuid, c->sb.set_uuid, 16);
		__entry->inode		= inode;
168 169 170
		__entry->sector		= bio->bi_iter.bi_sector;
		__entry->nr_sector	= bio->bi_iter.bi_size >> 9;
		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size);
K
Kent Overstreet 已提交
171 172 173
		__entry->writeback = writeback;
		__entry->bypass = bypass;
	),
K
Kent Overstreet 已提交
174

175 176
	TP_printk("%pU inode %llu  %s %llu + %u hit %u bypass %u",
		  __entry->uuid, __entry->inode,
K
Kent Overstreet 已提交
177 178 179
		  __entry->rwbs, (unsigned long long)__entry->sector,
		  __entry->nr_sector, __entry->writeback, __entry->bypass)
);
K
Kent Overstreet 已提交
180

K
Kent Overstreet 已提交
181
DEFINE_EVENT(bcache_bio, bcache_read_retry,
K
Kent Overstreet 已提交
182 183 184 185
	TP_PROTO(struct bio *bio),
	TP_ARGS(bio)
);

K
Kent Overstreet 已提交
186 187 188 189
DEFINE_EVENT(bkey, bcache_cache_insert,
	TP_PROTO(struct bkey *k),
	TP_ARGS(k)
);
K
Kent Overstreet 已提交
190

K
Kent Overstreet 已提交
191
/* Journal */
K
Kent Overstreet 已提交
192

K
Kent Overstreet 已提交
193 194 195
DECLARE_EVENT_CLASS(cache_set,
	TP_PROTO(struct cache_set *c),
	TP_ARGS(c),
K
Kent Overstreet 已提交
196

K
Kent Overstreet 已提交
197 198 199
	TP_STRUCT__entry(
		__array(char,		uuid,	16 )
	),
K
Kent Overstreet 已提交
200

K
Kent Overstreet 已提交
201 202 203
	TP_fast_assign(
		memcpy(__entry->uuid, c->sb.set_uuid, 16);
	),
K
Kent Overstreet 已提交
204

K
Kent Overstreet 已提交
205
	TP_printk("%pU", __entry->uuid)
K
Kent Overstreet 已提交
206 207
);

K
Kent Overstreet 已提交
208 209 210 211
DEFINE_EVENT(bkey, bcache_journal_replay_key,
	TP_PROTO(struct bkey *k),
	TP_ARGS(k)
);
K
Kent Overstreet 已提交
212

K
Kent Overstreet 已提交
213 214 215
DEFINE_EVENT(cache_set, bcache_journal_full,
	TP_PROTO(struct cache_set *c),
	TP_ARGS(c)
K
Kent Overstreet 已提交
216 217
);

K
Kent Overstreet 已提交
218 219 220 221
DEFINE_EVENT(cache_set, bcache_journal_entry_full,
	TP_PROTO(struct cache_set *c),
	TP_ARGS(c)
);
K
Kent Overstreet 已提交
222

K
Kent Overstreet 已提交
223
DEFINE_EVENT(bcache_bio, bcache_journal_write,
K
Kent Overstreet 已提交
224 225 226 227
	TP_PROTO(struct bio *bio),
	TP_ARGS(bio)
);

K
Kent Overstreet 已提交
228
/* Btree */
K
Kent Overstreet 已提交
229

K
Kent Overstreet 已提交
230 231 232 233
DEFINE_EVENT(cache_set, bcache_btree_cache_cannibalize,
	TP_PROTO(struct cache_set *c),
	TP_ARGS(c)
);
K
Kent Overstreet 已提交
234

K
Kent Overstreet 已提交
235 236 237
DEFINE_EVENT(btree_node, bcache_btree_read,
	TP_PROTO(struct btree *b),
	TP_ARGS(b)
K
Kent Overstreet 已提交
238 239
);

K
Kent Overstreet 已提交
240 241 242
TRACE_EVENT(bcache_btree_write,
	TP_PROTO(struct btree *b),
	TP_ARGS(b),
K
Kent Overstreet 已提交
243

K
Kent Overstreet 已提交
244 245 246 247 248
	TP_STRUCT__entry(
		__field(size_t,		bucket			)
		__field(unsigned,	block			)
		__field(unsigned,	keys			)
	),
K
Kent Overstreet 已提交
249

K
Kent Overstreet 已提交
250 251 252
	TP_fast_assign(
		__entry->bucket	= PTR_BUCKET_NR(b->c, &b->key, 0);
		__entry->block	= b->written;
K
Kent Overstreet 已提交
253
		__entry->keys	= b->keys.set[b->keys.nsets].data->keys;
K
Kent Overstreet 已提交
254 255 256
	),

	TP_printk("bucket %zu", __entry->bucket)
K
Kent Overstreet 已提交
257 258
);

K
Kent Overstreet 已提交
259 260 261 262
DEFINE_EVENT(btree_node, bcache_btree_node_alloc,
	TP_PROTO(struct btree *b),
	TP_ARGS(b)
);
K
Kent Overstreet 已提交
263

K
Kent Overstreet 已提交
264 265 266 267
DEFINE_EVENT(btree_node, bcache_btree_node_alloc_fail,
	TP_PROTO(struct btree *b),
	TP_ARGS(b)
);
K
Kent Overstreet 已提交
268

K
Kent Overstreet 已提交
269 270 271
DEFINE_EVENT(btree_node, bcache_btree_node_free,
	TP_PROTO(struct btree *b),
	TP_ARGS(b)
K
Kent Overstreet 已提交
272 273
);

K
Kent Overstreet 已提交
274 275 276
TRACE_EVENT(bcache_btree_gc_coalesce,
	TP_PROTO(unsigned nodes),
	TP_ARGS(nodes),
K
Kent Overstreet 已提交
277

K
Kent Overstreet 已提交
278 279 280
	TP_STRUCT__entry(
		__field(unsigned,	nodes			)
	),
K
Kent Overstreet 已提交
281

K
Kent Overstreet 已提交
282 283 284
	TP_fast_assign(
		__entry->nodes	= nodes;
	),
K
Kent Overstreet 已提交
285

K
Kent Overstreet 已提交
286 287
	TP_printk("coalesced %u nodes", __entry->nodes)
);
K
Kent Overstreet 已提交
288

K
Kent Overstreet 已提交
289 290 291 292
DEFINE_EVENT(cache_set, bcache_gc_start,
	TP_PROTO(struct cache_set *c),
	TP_ARGS(c)
);
K
Kent Overstreet 已提交
293

K
Kent Overstreet 已提交
294 295 296
DEFINE_EVENT(cache_set, bcache_gc_end,
	TP_PROTO(struct cache_set *c),
	TP_ARGS(c)
K
Kent Overstreet 已提交
297 298
);

K
Kent Overstreet 已提交
299 300 301 302
DEFINE_EVENT(bkey, bcache_gc_copy,
	TP_PROTO(struct bkey *k),
	TP_ARGS(k)
);
K
Kent Overstreet 已提交
303

K
Kent Overstreet 已提交
304 305 306 307
DEFINE_EVENT(bkey, bcache_gc_copy_collision,
	TP_PROTO(struct bkey *k),
	TP_ARGS(k)
);
K
Kent Overstreet 已提交
308

309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341
TRACE_EVENT(bcache_btree_insert_key,
	TP_PROTO(struct btree *b, struct bkey *k, unsigned op, unsigned status),
	TP_ARGS(b, k, op, status),

	TP_STRUCT__entry(
		__field(u64,	btree_node			)
		__field(u32,	btree_level			)
		__field(u32,	inode				)
		__field(u64,	offset				)
		__field(u32,	size				)
		__field(u8,	dirty				)
		__field(u8,	op				)
		__field(u8,	status				)
	),

	TP_fast_assign(
		__entry->btree_node = PTR_BUCKET_NR(b->c, &b->key, 0);
		__entry->btree_level = b->level;
		__entry->inode	= KEY_INODE(k);
		__entry->offset	= KEY_OFFSET(k);
		__entry->size	= KEY_SIZE(k);
		__entry->dirty	= KEY_DIRTY(k);
		__entry->op = op;
		__entry->status = status;
	),

	TP_printk("%u for %u at %llu(%u): %u:%llu len %u dirty %u",
		  __entry->status, __entry->op,
		  __entry->btree_node, __entry->btree_level,
		  __entry->inode, __entry->offset,
		  __entry->size, __entry->dirty)
);

K
Kent Overstreet 已提交
342 343 344
DECLARE_EVENT_CLASS(btree_split,
	TP_PROTO(struct btree *b, unsigned keys),
	TP_ARGS(b, keys),
K
Kent Overstreet 已提交
345 346

	TP_STRUCT__entry(
K
Kent Overstreet 已提交
347 348
		__field(size_t,		bucket			)
		__field(unsigned,	keys			)
K
Kent Overstreet 已提交
349 350 351
	),

	TP_fast_assign(
K
Kent Overstreet 已提交
352 353
		__entry->bucket	= PTR_BUCKET_NR(b->c, &b->key, 0);
		__entry->keys	= keys;
K
Kent Overstreet 已提交
354 355
	),

K
Kent Overstreet 已提交
356
	TP_printk("bucket %zu keys %u", __entry->bucket, __entry->keys)
K
Kent Overstreet 已提交
357 358
);

K
Kent Overstreet 已提交
359 360 361 362
DEFINE_EVENT(btree_split, bcache_btree_node_split,
	TP_PROTO(struct btree *b, unsigned keys),
	TP_ARGS(b, keys)
);
K
Kent Overstreet 已提交
363

K
Kent Overstreet 已提交
364 365 366
DEFINE_EVENT(btree_split, bcache_btree_node_compact,
	TP_PROTO(struct btree *b, unsigned keys),
	TP_ARGS(b, keys)
K
Kent Overstreet 已提交
367 368
);

K
Kent Overstreet 已提交
369 370 371 372
DEFINE_EVENT(btree_node, bcache_btree_set_root,
	TP_PROTO(struct btree *b),
	TP_ARGS(b)
);
K
Kent Overstreet 已提交
373

374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402
TRACE_EVENT(bcache_keyscan,
	TP_PROTO(unsigned nr_found,
		 unsigned start_inode, uint64_t start_offset,
		 unsigned end_inode, uint64_t end_offset),
	TP_ARGS(nr_found,
		start_inode, start_offset,
		end_inode, end_offset),

	TP_STRUCT__entry(
		__field(__u32,	nr_found			)
		__field(__u32,	start_inode			)
		__field(__u64,	start_offset			)
		__field(__u32,	end_inode			)
		__field(__u64,	end_offset			)
	),

	TP_fast_assign(
		__entry->nr_found	= nr_found;
		__entry->start_inode	= start_inode;
		__entry->start_offset	= start_offset;
		__entry->end_inode	= end_inode;
		__entry->end_offset	= end_offset;
	),

	TP_printk("found %u keys from %u:%llu to %u:%llu", __entry->nr_found,
		  __entry->start_inode, __entry->start_offset,
		  __entry->end_inode, __entry->end_offset)
);

K
Kent Overstreet 已提交
403
/* Allocator */
K
Kent Overstreet 已提交
404

405 406 407
TRACE_EVENT(bcache_invalidate,
	TP_PROTO(struct cache *ca, size_t bucket),
	TP_ARGS(ca, bucket),
K
Kent Overstreet 已提交
408 409

	TP_STRUCT__entry(
410 411 412
		__field(unsigned,	sectors			)
		__field(dev_t,		dev			)
		__field(__u64,		offset			)
K
Kent Overstreet 已提交
413 414 415
	),

	TP_fast_assign(
416 417 418
		__entry->dev		= ca->bdev->bd_dev;
		__entry->offset		= bucket << ca->set->bucket_bits;
		__entry->sectors	= GC_SECTORS_USED(&ca->buckets[bucket]);
K
Kent Overstreet 已提交
419 420
	),

421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441
	TP_printk("invalidated %u sectors at %d,%d sector=%llu",
		  __entry->sectors, MAJOR(__entry->dev),
		  MINOR(__entry->dev), __entry->offset)
);

TRACE_EVENT(bcache_alloc,
	TP_PROTO(struct cache *ca, size_t bucket),
	TP_ARGS(ca, bucket),

	TP_STRUCT__entry(
		__field(dev_t,		dev			)
		__field(__u64,		offset			)
	),

	TP_fast_assign(
		__entry->dev		= ca->bdev->bd_dev;
		__entry->offset		= bucket << ca->set->bucket_bits;
	),

	TP_printk("allocated %d,%d sector=%llu", MAJOR(__entry->dev),
		  MINOR(__entry->dev), __entry->offset)
K
Kent Overstreet 已提交
442 443
);

K
Kent Overstreet 已提交
444
TRACE_EVENT(bcache_alloc_fail,
445 446
	TP_PROTO(struct cache *ca, unsigned reserve),
	TP_ARGS(ca, reserve),
K
Kent Overstreet 已提交
447

K
Kent Overstreet 已提交
448
	TP_STRUCT__entry(
449
		__field(dev_t,		dev			)
K
Kent Overstreet 已提交
450 451 452 453
		__field(unsigned,	free			)
		__field(unsigned,	free_inc		)
		__field(unsigned,	blocked			)
	),
K
Kent Overstreet 已提交
454

K
Kent Overstreet 已提交
455
	TP_fast_assign(
456
		__entry->dev		= ca->bdev->bd_dev;
457
		__entry->free		= fifo_used(&ca->free[reserve]);
K
Kent Overstreet 已提交
458 459 460
		__entry->free_inc	= fifo_used(&ca->free_inc);
		__entry->blocked	= atomic_read(&ca->set->prio_blocked);
	),
K
Kent Overstreet 已提交
461

K
Kent Overstreet 已提交
462
	TP_printk("alloc fail %d,%d free %u free_inc %u blocked %u",
463
		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->free,
K
Kent Overstreet 已提交
464
		  __entry->free_inc, __entry->blocked)
K
Kent Overstreet 已提交
465 466
);

K
Kent Overstreet 已提交
467
/* Background writeback */
K
Kent Overstreet 已提交
468

K
Kent Overstreet 已提交
469 470 471 472
DEFINE_EVENT(bkey, bcache_writeback,
	TP_PROTO(struct bkey *k),
	TP_ARGS(k)
);
K
Kent Overstreet 已提交
473

K
Kent Overstreet 已提交
474 475 476
DEFINE_EVENT(bkey, bcache_writeback_collision,
	TP_PROTO(struct bkey *k),
	TP_ARGS(k)
K
Kent Overstreet 已提交
477 478 479 480 481 482
);

#endif /* _TRACE_BCACHE_H */

/* This part must be outside protection */
#include <trace/define_trace.h>