summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSlava Pestov <sviatoslavpestov@gmail.com>2014-06-26 23:46:52 -0700
committerKent Overstreet <kent.overstreet@gmail.com>2016-10-07 09:00:24 -0800
commit6945fe6a72d331d2e670fbfdaa61af0b6d59c367 (patch)
treedf49f1d02481ce4228d4483d355dbf2e6ada0299
parent24c1381a9642c9342afce095c86158ed56ca7e3a (diff)
bcache: add tracepoints for -EINTRy things
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r--drivers/md/bcache/btree.c17
-rw-r--r--include/trace/events/bcache.h58
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)