diff options
-rw-r--r-- | drivers/md/bcache/btree.c | 17 | ||||
-rw-r--r-- | include/trace/events/bcache.h | 58 |
2 files changed, 73 insertions, 2 deletions
diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c index c0968adc6b4b..301d311e2d16 100644 --- a/drivers/md/bcache/btree.c +++ b/drivers/md/bcache/btree.c @@ -444,6 +444,8 @@ static void do_btree_node_write(struct btree *b) bch_submit_bbio_replicas(b->bio, b->c, &k.key, ptrs_to_write); continue_at(cl, btree_node_write_done, NULL); } else { + trace_bcache_btree_write_sync(b); + b->bio->bi_vcnt = 0; bch_bio_map(b->bio, i); @@ -1487,6 +1489,8 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op, return -EINTR; out_nocoalesce: + trace_bcache_btree_gc_coalesce_fail(b->c); + /* We may have written out some new nodes which are garbage now, * wait for writes to finish */ closure_sync(&cl); @@ -1517,11 +1521,14 @@ static int btree_gc_rewrite_node(struct btree *b, struct btree_op *op, /* recheck reserve after allocating replacement node */ if (btree_check_reserve(b, NULL)) { + trace_bcache_btree_gc_rewrite_node_fail(b); btree_node_free(n); rw_unlock(true, n); return 0; } + trace_bcache_btree_gc_rewrite_node(b); + bch_btree_node_write_sync(n); bch_keylist_init(&keys); @@ -2418,6 +2425,7 @@ int bch_btree_insert_node(struct btree *b, struct btree_op *op, /* The first time this is called, we don't have a write lock * on the parent yet, so update op->lock and start again. */ if (op->lock <= btree_node_root(b)->level) { + trace_bcache_btree_upgrade_lock_fail(b, op); op->lock = btree_node_root(b)->level + 1; return -EINTR; } else { @@ -2458,9 +2466,12 @@ int bch_btree_insert_check_key(struct btree *b, struct btree_op *op, if (b->key.val[0] != btree_ptr || b->seq != seq + 1) { + trace_bcache_btree_upgrade_lock_fail(b, op); op->lock = b->level; goto out; - } + } + + trace_bcache_btree_upgrade_lock(b, op); } bch_set_extent_ptrs(check_key, 1); @@ -2617,8 +2628,10 @@ static int do_map_fn(struct btree *b, struct btree_op *op, struct bkey *from, if (ret == MAP_CONTINUE) *from = next; - if (ret == MAP_CONTINUE && op->iterator_invalidated) + if (ret == MAP_CONTINUE && op->iterator_invalidated) { + trace_bcache_btree_iterator_invalidated(b, op); ret = -EINTR; + } return ret; } diff --git a/include/trace/events/bcache.h b/include/trace/events/bcache.h index defd85ca1d4c..6ac900e71628 100644 --- a/include/trace/events/bcache.h +++ b/include/trace/events/bcache.h @@ -262,6 +262,11 @@ TRACE_EVENT(bcache_btree_write, __entry->bucket, __entry->block, __entry->keys) ); +DEFINE_EVENT(btree_node, bcache_btree_write_sync, + TP_PROTO(struct btree *b), + TP_ARGS(b) +); + DEFINE_EVENT(btree_node, bcache_btree_node_alloc, TP_PROTO(struct btree *b), TP_ARGS(b) @@ -338,6 +343,44 @@ DEFINE_EVENT(cache_set, bcache_mca_cannibalize_unlock, TP_ARGS(c) ); +DECLARE_EVENT_CLASS(btree_node_op, + TP_PROTO(struct btree *b, void *op), + TP_ARGS(b, op), + + TP_STRUCT__entry( + __array(char, uuid, 16 ) + __field(size_t, bucket ) + __field(enum btree_id, id ) + __field(void *, op ) + ), + + TP_fast_assign( + memcpy(__entry->uuid, b->c->sb.set_uuid.b, 16); + __entry->bucket = PTR_BUCKET_NR(b->c, &b->key, 0); + __entry->id = b->btree_id; + __entry->op = op; + ), + + TP_printk("%pU bucket %zu id %u op %p", __entry->uuid, __entry->bucket, + __entry->id, __entry->op) +); + +DEFINE_EVENT(btree_node_op, bcache_btree_upgrade_lock, + TP_PROTO(struct btree *b, void *op), + TP_ARGS(b, op) +); + +DEFINE_EVENT(btree_node_op, bcache_btree_upgrade_lock_fail, + TP_PROTO(struct btree *b, void *op), + TP_ARGS(b, op) +); + +DEFINE_EVENT(btree_node_op, bcache_btree_iterator_invalidated, + TP_PROTO(struct btree *b, void *op), + TP_ARGS(b, op) +); + + /* Garbage collection */ TRACE_EVENT(bcache_btree_gc_coalesce, @@ -355,6 +398,21 @@ TRACE_EVENT(bcache_btree_gc_coalesce, TP_printk("coalesced %u nodes", __entry->nodes) ); +DEFINE_EVENT(cache_set, bcache_btree_gc_coalesce_fail, + TP_PROTO(struct cache_set *c), + TP_ARGS(c) +); + +DEFINE_EVENT(btree_node, bcache_btree_gc_rewrite_node, + TP_PROTO(struct btree *b), + TP_ARGS(b) +); + +DEFINE_EVENT(btree_node, bcache_btree_gc_rewrite_node_fail, + TP_PROTO(struct btree *b), + TP_ARGS(b) +); + DEFINE_EVENT(cache_set, bcache_gc_start, TP_PROTO(struct cache_set *c), TP_ARGS(c) |