diff options
author | Kent Overstreet <kmo@daterainc.com> | 2014-02-12 21:43:32 -0500 |
---|---|---|
committer | Kent Overstreet <kmo@daterainc.com> | 2014-03-18 15:22:35 -0400 |
commit | 7159b1ad3dded9da040b5c608acf3d52d50f661e (patch) | |
tree | 3ec196333d8ae22e359dc7d16fe8d48b8352fbea | |
parent | 3f5e0a34daed197aa55d0c6b466bb4cd03babb4f (diff) |
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>
-rw-r--r-- | drivers/md/bcache/alloc.c | 15 | ||||
-rw-r--r-- | drivers/md/bcache/trace.c | 2 | ||||
-rw-r--r-- | include/trace/events/bcache.h | 48 |
3 files changed, 46 insertions, 19 deletions
diff --git a/drivers/md/bcache/alloc.c b/drivers/md/bcache/alloc.c index c0d37d082443..a3e1427945f2 100644 --- a/drivers/md/bcache/alloc.c +++ b/drivers/md/bcache/alloc.c | |||
@@ -162,10 +162,15 @@ static bool can_invalidate_bucket(struct cache *ca, struct bucket *b) | |||
162 | 162 | ||
163 | static void invalidate_one_bucket(struct cache *ca, struct bucket *b) | 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 | bch_inc_gen(ca, b); | 170 | bch_inc_gen(ca, b); |
166 | b->prio = INITIAL_PRIO; | 171 | b->prio = INITIAL_PRIO; |
167 | atomic_inc(&b->pin); | 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 | /* |
@@ -301,8 +306,6 @@ static void invalidate_buckets(struct cache *ca) | |||
301 | invalidate_buckets_random(ca); | 306 | invalidate_buckets_random(ca); |
302 | break; | 307 | break; |
303 | } | 308 | } |
304 | |||
305 | trace_bcache_alloc_invalidate(ca); | ||
306 | } | 309 | } |
307 | 310 | ||
308 | #define allocator_wait(ca, cond) \ | 311 | #define allocator_wait(ca, cond) \ |
@@ -408,8 +411,10 @@ long bch_bucket_alloc(struct cache *ca, unsigned reserve, bool wait) | |||
408 | fifo_pop(&ca->free[reserve], r)) | 411 | fifo_pop(&ca->free[reserve], r)) |
409 | goto out; | 412 | goto out; |
410 | 413 | ||
411 | if (!wait) | 414 | if (!wait) { |
415 | trace_bcache_alloc_fail(ca, reserve); | ||
412 | return -1; | 416 | return -1; |
417 | } | ||
413 | 418 | ||
414 | do { | 419 | do { |
415 | prepare_to_wait(&ca->set->bucket_wait, &w, | 420 | prepare_to_wait(&ca->set->bucket_wait, &w, |
@@ -425,6 +430,8 @@ long bch_bucket_alloc(struct cache *ca, unsigned reserve, bool wait) | |||
425 | out: | 430 | out: |
426 | wake_up_process(ca->alloc_thread); | 431 | wake_up_process(ca->alloc_thread); |
427 | 432 | ||
433 | trace_bcache_alloc(ca, reserve); | ||
434 | |||
428 | if (expensive_debug_checks(ca->set)) { | 435 | if (expensive_debug_checks(ca->set)) { |
429 | size_t iter; | 436 | size_t iter; |
430 | long i; | 437 | long i; |
diff --git a/drivers/md/bcache/trace.c b/drivers/md/bcache/trace.c index adbc3df17a80..b7820b0d2621 100644 --- a/drivers/md/bcache/trace.c +++ b/drivers/md/bcache/trace.c | |||
@@ -45,7 +45,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_btree_node_split); | |||
45 | EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_btree_node_compact); | 45 | EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_btree_node_compact); |
46 | EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_btree_set_root); | 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 | EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_alloc_fail); | 49 | EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_alloc_fail); |
50 | 50 | ||
51 | EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_writeback); | 51 | EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_writeback); |
diff --git a/include/trace/events/bcache.h b/include/trace/events/bcache.h index 7110897c3dfa..8fc2a7134d3c 100644 --- a/include/trace/events/bcache.h +++ b/include/trace/events/bcache.h | |||
@@ -399,26 +399,43 @@ TRACE_EVENT(bcache_keyscan, | |||
399 | 399 | ||
400 | /* Allocator */ | 400 | /* Allocator */ |
401 | 401 | ||
402 | TRACE_EVENT(bcache_alloc_invalidate, | 402 | TRACE_EVENT(bcache_invalidate, |
403 | TP_PROTO(struct cache *ca), | 403 | TP_PROTO(struct cache *ca, size_t bucket), |
404 | TP_ARGS(ca), | 404 | TP_ARGS(ca, bucket), |
405 | 405 | ||
406 | TP_STRUCT__entry( | 406 | TP_STRUCT__entry( |
407 | __field(unsigned, free ) | 407 | __field(unsigned, sectors ) |
408 | __field(unsigned, free_inc ) | 408 | __field(dev_t, dev ) |
409 | __field(unsigned, free_inc_size ) | 409 | __field(__u64, offset ) |
410 | __field(unsigned, unused ) | ||
411 | ), | 410 | ), |
412 | 411 | ||
413 | TP_fast_assign( | 412 | TP_fast_assign( |
414 | __entry->free = fifo_used(&ca->free[RESERVE_NONE]); | 413 | __entry->dev = ca->bdev->bd_dev; |
415 | __entry->free_inc = fifo_used(&ca->free_inc); | 414 | __entry->offset = bucket << ca->set->bucket_bits; |
416 | __entry->free_inc_size = ca->free_inc.size; | 415 | __entry->sectors = GC_SECTORS_USED(&ca->buckets[bucket]); |
417 | __entry->unused = fifo_used(&ca->unused); | ||
418 | ), | 416 | ), |
419 | 417 | ||
420 | TP_printk("free %u free_inc %u/%u unused %u", __entry->free, | 418 | TP_printk("invalidated %u sectors at %d,%d sector=%llu", |
421 | __entry->free_inc, __entry->free_inc_size, __entry->unused) | 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 | TRACE_EVENT(bcache_alloc_fail, | 441 | TRACE_EVENT(bcache_alloc_fail, |
@@ -426,6 +443,7 @@ TRACE_EVENT(bcache_alloc_fail, | |||
426 | TP_ARGS(ca, reserve), | 443 | TP_ARGS(ca, reserve), |
427 | 444 | ||
428 | TP_STRUCT__entry( | 445 | TP_STRUCT__entry( |
446 | __field(dev_t, dev ) | ||
429 | __field(unsigned, free ) | 447 | __field(unsigned, free ) |
430 | __field(unsigned, free_inc ) | 448 | __field(unsigned, free_inc ) |
431 | __field(unsigned, unused ) | 449 | __field(unsigned, unused ) |
@@ -433,13 +451,15 @@ TRACE_EVENT(bcache_alloc_fail, | |||
433 | ), | 451 | ), |
434 | 452 | ||
435 | TP_fast_assign( | 453 | TP_fast_assign( |
454 | __entry->dev = ca->bdev->bd_dev; | ||
436 | __entry->free = fifo_used(&ca->free[reserve]); | 455 | __entry->free = fifo_used(&ca->free[reserve]); |
437 | __entry->free_inc = fifo_used(&ca->free_inc); | 456 | __entry->free_inc = fifo_used(&ca->free_inc); |
438 | __entry->unused = fifo_used(&ca->unused); | 457 | __entry->unused = fifo_used(&ca->unused); |
439 | __entry->blocked = atomic_read(&ca->set->prio_blocked); | 458 | __entry->blocked = atomic_read(&ca->set->prio_blocked); |
440 | ), | 459 | ), |
441 | 460 | ||
442 | TP_printk("free %u free_inc %u unused %u blocked %u", __entry->free, | 461 | TP_printk("alloc fail %d,%d free %u free_inc %u unused %u blocked %u", |
462 | MAJOR(__entry->dev), MINOR(__entry->dev), __entry->free, | ||
443 | __entry->free_inc, __entry->unused, __entry->blocked) | 463 | __entry->free_inc, __entry->unused, __entry->blocked) |
444 | ); | 464 | ); |
445 | 465 | ||