diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-04-23 00:10:08 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2019-04-23 00:10:08 -0400 |
commit | fbe437f137871e81792287649b3826323ce0d5b7 (patch) | |
tree | 5625f64d31b6863627d3ee22d8d3f723036f801c | |
parent | 990250b29634fa59d8689f49a9fd7b5d4c134634 (diff) |
bcachefs: Add actual tracepoints for transaction restarts
-rw-r--r-- | fs/bcachefs/btree_cache.c | 2 | ||||
-rw-r--r-- | fs/bcachefs/btree_iter.c | 14 | ||||
-rw-r--r-- | fs/bcachefs/btree_types.h | 1 | ||||
-rw-r--r-- | fs/bcachefs/btree_update_leaf.c | 7 | ||||
-rw-r--r-- | include/trace/events/bcachefs.h | 72 |
5 files changed, 92 insertions, 4 deletions
diff --git a/fs/bcachefs/btree_cache.c b/fs/bcachefs/btree_cache.c index 074ea6f16c9d..2a20bdef8fd0 100644 --- a/fs/bcachefs/btree_cache.c +++ b/fs/bcachefs/btree_cache.c @@ -732,6 +732,8 @@ retry: goto retry; trans_restart(); + trace_trans_restart_btree_node_reused(c, + iter->trans->ip); return ERR_PTR(-EINTR); } } diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index 49ddf05cc9a9..5631f98f3845 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -251,12 +251,15 @@ bool __bch2_btree_node_lock(struct btree *b, struct bpos pos, } } - if (ret) - __btree_node_lock_type(iter->trans->c, b, type); - else + if (unlikely(!ret)) { trans_restart(); + trace_trans_restart_would_deadlock(iter->trans->c, + iter->trans->ip); + return false; + } - return ret; + __btree_node_lock_type(iter->trans->c, b, type); + return true; } /* Btree iterator locking: */ @@ -1692,6 +1695,7 @@ success: if (trans->iters_live) { trans_restart(); + trace_trans_restart_iters_realloced(trans->c, trans->ip); return -EINTR; } @@ -1859,6 +1863,7 @@ void *bch2_trans_kmalloc(struct btree_trans *trans, if (old_bytes) { trans_restart(); + trace_trans_restart_mem_realloced(trans->c, trans->ip); return ERR_PTR(-EINTR); } } @@ -1935,6 +1940,7 @@ void bch2_trans_init(struct btree_trans *trans, struct bch_fs *c) memset(trans, 0, offsetof(struct btree_trans, iters_onstack)); trans->c = c; + trans->ip = _RET_IP_; trans->size = ARRAY_SIZE(trans->iters_onstack); trans->iters = trans->iters_onstack; trans->updates = trans->updates_onstack; diff --git a/fs/bcachefs/btree_types.h b/fs/bcachefs/btree_types.h index ae273ab7aa1a..57ef50142ee1 100644 --- a/fs/bcachefs/btree_types.h +++ b/fs/bcachefs/btree_types.h @@ -268,6 +268,7 @@ struct btree_insert_entry { struct btree_trans { struct bch_fs *c; + unsigned long ip; size_t nr_restarts; u64 commit_start; diff --git a/fs/bcachefs/btree_update_leaf.c b/fs/bcachefs/btree_update_leaf.c index d052ca541965..dde1fc1f97a2 100644 --- a/fs/bcachefs/btree_update_leaf.c +++ b/fs/bcachefs/btree_update_leaf.c @@ -439,6 +439,7 @@ static int bch2_trans_journal_preres_get(struct btree_trans *trans) if (!bch2_btree_trans_relock(trans)) { trans_restart(" (iter relock after journal preres get blocked)"); + trace_trans_restart_journal_preres_get(c, trans->ip); return -EINTR; } @@ -575,6 +576,7 @@ static inline int do_btree_insert_at(struct btree_trans *trans, if (race_fault()) { ret = -EINTR; trans_restart(" (race)"); + trace_trans_restart_fault_inject(c, trans->ip); goto out; } @@ -725,6 +727,7 @@ int bch2_trans_commit_error(struct btree_trans *trans, */ if (!ret || (flags & BTREE_INSERT_NOUNLOCK)) { trans_restart(" (split)"); + trace_trans_restart_btree_node_split(c, trans->ip); ret = -EINTR; } break; @@ -744,6 +747,7 @@ int bch2_trans_commit_error(struct btree_trans *trans, return 0; trans_restart(" (iter relock after marking replicas)"); + trace_trans_restart_mark_replicas(c, trans->ip); ret = -EINTR; break; case BTREE_INSERT_NEED_JOURNAL_RES: @@ -757,6 +761,7 @@ int bch2_trans_commit_error(struct btree_trans *trans, return 0; trans_restart(" (iter relock after journal res get blocked)"); + trace_trans_restart_journal_res_get(c, trans->ip); ret = -EINTR; break; default: @@ -769,6 +774,7 @@ int bch2_trans_commit_error(struct btree_trans *trans, if (ret2) { trans_restart(" (traverse)"); + trace_trans_restart_traverse(c, trans->ip); return ret2; } @@ -780,6 +786,7 @@ int bch2_trans_commit_error(struct btree_trans *trans, return 0; trans_restart(" (atomic)"); + trace_trans_restart_atomic(c, trans->ip); } return ret; diff --git a/include/trace/events/bcachefs.h b/include/trace/events/bcachefs.h index 6781a5b58953..5fa570a516a7 100644 --- a/include/trace/events/bcachefs.h +++ b/include/trace/events/bcachefs.h @@ -498,6 +498,78 @@ TRACE_EVENT(copygc, __entry->buckets_moved, __entry->buckets_not_moved) ); +DECLARE_EVENT_CLASS(transaction_restart, + TP_PROTO(struct bch_fs *c, unsigned long ip), + TP_ARGS(c, ip), + + TP_STRUCT__entry( + __array(char, name, 16) + __field(unsigned long, ip ) + ), + + TP_fast_assign( + memcpy(__entry->name, c->name, 16); + __entry->ip = ip; + ), + + TP_printk("%pf", (void *) __entry->ip) +); + +DEFINE_EVENT(transaction_restart, trans_restart_btree_node_reused, + TP_PROTO(struct bch_fs *c, unsigned long ip), + TP_ARGS(c, ip) +); + +DEFINE_EVENT(transaction_restart, trans_restart_would_deadlock, + TP_PROTO(struct bch_fs *c, unsigned long ip), + TP_ARGS(c, ip) +); + +DEFINE_EVENT(transaction_restart, trans_restart_iters_realloced, + TP_PROTO(struct bch_fs *c, unsigned long ip), + TP_ARGS(c, ip) +); + +DEFINE_EVENT(transaction_restart, trans_restart_mem_realloced, + TP_PROTO(struct bch_fs *c, unsigned long ip), + TP_ARGS(c, ip) +); + +DEFINE_EVENT(transaction_restart, trans_restart_journal_res_get, + TP_PROTO(struct bch_fs *c, unsigned long ip), + TP_ARGS(c, ip) +); + +DEFINE_EVENT(transaction_restart, trans_restart_journal_preres_get, + TP_PROTO(struct bch_fs *c, unsigned long ip), + TP_ARGS(c, ip) +); + +DEFINE_EVENT(transaction_restart, trans_restart_mark_replicas, + TP_PROTO(struct bch_fs *c, unsigned long ip), + TP_ARGS(c, ip) +); + +DEFINE_EVENT(transaction_restart, trans_restart_fault_inject, + TP_PROTO(struct bch_fs *c, unsigned long ip), + TP_ARGS(c, ip) +); + +DEFINE_EVENT(transaction_restart, trans_restart_btree_node_split, + TP_PROTO(struct bch_fs *c, unsigned long ip), + TP_ARGS(c, ip) +); + +DEFINE_EVENT(transaction_restart, trans_restart_traverse, + TP_PROTO(struct bch_fs *c, unsigned long ip), + TP_ARGS(c, ip) +); + +DEFINE_EVENT(transaction_restart, trans_restart_atomic, + TP_PROTO(struct bch_fs *c, unsigned long ip), + TP_ARGS(c, ip) +); + #endif /* _TRACE_BCACHE_H */ /* This part must be outside protection */ |