Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bcache: Better alloc tracepoints

Change the invalidate tracepoint to indicate how much data we're invalidating,
and change the alloc tracepoints to indicate what offset they're for.

Signed-off-by: Kent Overstreet <kmo@daterainc.com>

+46 -19
+11 -4
drivers/md/bcache/alloc.c
··· 162 162 163 163 static void invalidate_one_bucket(struct cache *ca, struct bucket *b) 164 164 { 165 + size_t bucket = b - ca->buckets; 166 + 167 + if (GC_SECTORS_USED(b)) 168 + trace_bcache_invalidate(ca, bucket); 169 + 165 170 bch_inc_gen(ca, b); 166 171 b->prio = INITIAL_PRIO; 167 172 atomic_inc(&b->pin); 168 - fifo_push(&ca->free_inc, b - ca->buckets); 173 + fifo_push(&ca->free_inc, bucket); 169 174 } 170 175 171 176 /* ··· 306 301 invalidate_buckets_random(ca); 307 302 break; 308 303 } 309 - 310 - trace_bcache_alloc_invalidate(ca); 311 304 } 312 305 313 306 #define allocator_wait(ca, cond) \ ··· 411 408 fifo_pop(&ca->free[reserve], r)) 412 409 goto out; 413 410 414 - if (!wait) 411 + if (!wait) { 412 + trace_bcache_alloc_fail(ca, reserve); 415 413 return -1; 414 + } 416 415 417 416 do { 418 417 prepare_to_wait(&ca->set->bucket_wait, &w, ··· 429 424 finish_wait(&ca->set->bucket_wait, &w); 430 425 out: 431 426 wake_up_process(ca->alloc_thread); 427 + 428 + trace_bcache_alloc(ca, reserve); 432 429 433 430 if (expensive_debug_checks(ca->set)) { 434 431 size_t iter;
+1 -1
drivers/md/bcache/trace.c
··· 45 45 EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_btree_node_compact); 46 46 EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_btree_set_root); 47 47 48 - EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_alloc_invalidate); 48 + EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_invalidate); 49 49 EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_alloc_fail); 50 50 51 51 EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_writeback);
+34 -14
include/trace/events/bcache.h
··· 399 399 400 400 /* Allocator */ 401 401 402 - TRACE_EVENT(bcache_alloc_invalidate, 403 - TP_PROTO(struct cache *ca), 404 - TP_ARGS(ca), 402 + TRACE_EVENT(bcache_invalidate, 403 + TP_PROTO(struct cache *ca, size_t bucket), 404 + TP_ARGS(ca, bucket), 405 405 406 406 TP_STRUCT__entry( 407 - __field(unsigned, free ) 408 - __field(unsigned, free_inc ) 409 - __field(unsigned, free_inc_size ) 410 - __field(unsigned, unused ) 407 + __field(unsigned, sectors ) 408 + __field(dev_t, dev ) 409 + __field(__u64, offset ) 411 410 ), 412 411 413 412 TP_fast_assign( 414 - __entry->free = fifo_used(&ca->free[RESERVE_NONE]); 415 - __entry->free_inc = fifo_used(&ca->free_inc); 416 - __entry->free_inc_size = ca->free_inc.size; 417 - __entry->unused = fifo_used(&ca->unused); 413 + __entry->dev = ca->bdev->bd_dev; 414 + __entry->offset = bucket << ca->set->bucket_bits; 415 + __entry->sectors = GC_SECTORS_USED(&ca->buckets[bucket]); 418 416 ), 419 417 420 - TP_printk("free %u free_inc %u/%u unused %u", __entry->free, 421 - __entry->free_inc, __entry->free_inc_size, __entry->unused) 418 + TP_printk("invalidated %u sectors at %d,%d sector=%llu", 419 + __entry->sectors, MAJOR(__entry->dev), 420 + MINOR(__entry->dev), __entry->offset) 421 + ); 422 + 423 + TRACE_EVENT(bcache_alloc, 424 + TP_PROTO(struct cache *ca, size_t bucket), 425 + TP_ARGS(ca, bucket), 426 + 427 + TP_STRUCT__entry( 428 + __field(dev_t, dev ) 429 + __field(__u64, offset ) 430 + ), 431 + 432 + TP_fast_assign( 433 + __entry->dev = ca->bdev->bd_dev; 434 + __entry->offset = bucket << ca->set->bucket_bits; 435 + ), 436 + 437 + TP_printk("allocated %d,%d sector=%llu", MAJOR(__entry->dev), 438 + MINOR(__entry->dev), __entry->offset) 422 439 ); 423 440 424 441 TRACE_EVENT(bcache_alloc_fail, ··· 443 426 TP_ARGS(ca, reserve), 444 427 445 428 TP_STRUCT__entry( 429 + __field(dev_t, dev ) 446 430 __field(unsigned, free ) 447 431 __field(unsigned, free_inc ) 448 432 __field(unsigned, unused ) ··· 451 433 ), 452 434 453 435 TP_fast_assign( 436 + __entry->dev = ca->bdev->bd_dev; 454 437 __entry->free = fifo_used(&ca->free[reserve]); 455 438 __entry->free_inc = fifo_used(&ca->free_inc); 456 439 __entry->unused = fifo_used(&ca->unused); 457 440 __entry->blocked = atomic_read(&ca->set->prio_blocked); 458 441 ), 459 442 460 - TP_printk("free %u free_inc %u unused %u blocked %u", __entry->free, 443 + TP_printk("alloc fail %d,%d free %u free_inc %u unused %u blocked %u", 444 + MAJOR(__entry->dev), MINOR(__entry->dev), __entry->free, 461 445 __entry->free_inc, __entry->unused, __entry->blocked) 462 446 ); 463 447