summaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2022-07-06 00:27:44 +0300
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-23 00:09:36 +0300
commit0990efaeeab14de1e3e3bf2791808afebadd1cc4 (patch)
treee00b17389b2d18dbf21cee04a4870df9a7d1c551 /fs
parent90cecb921cfe95858a32995019f11c20b6339607 (diff)
downloadlinux-0990efaeeab14de1e3e3bf2791808afebadd1cc4.tar.xz
bcachefs: btree_trans_too_many_iters() is now a transaction restart
All transaction restarts need a tracepoint - this is essential for debugging Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs')
-rw-r--r--fs/bcachefs/btree_iter.h9
-rw-r--r--fs/bcachefs/trace.h6
2 files changed, 13 insertions, 2 deletions
diff --git a/fs/bcachefs/btree_iter.h b/fs/bcachefs/btree_iter.h
index c2f5afc9eeb9..1952a7683610 100644
--- a/fs/bcachefs/btree_iter.h
+++ b/fs/bcachefs/btree_iter.h
@@ -4,6 +4,7 @@
#include "bset.h"
#include "btree_types.h"
+#include "trace.h"
static inline void __btree_path_get(struct btree_path *path, bool intent)
{
@@ -384,8 +385,12 @@ static inline struct bkey_s_c bch2_btree_iter_peek_upto_type(struct btree_iter *
static inline int btree_trans_too_many_iters(struct btree_trans *trans)
{
- return hweight64(trans->paths_allocated) > BTREE_ITER_MAX / 2
- ? -EINTR : 0;
+ if (hweight64(trans->paths_allocated) > BTREE_ITER_MAX / 2) {
+ trace_trans_restart_too_many_iters(trans->fn, _THIS_IP_);
+ return btree_trans_restart(trans);
+ }
+
+ return 0;
}
static inline struct bkey_s_c
diff --git a/fs/bcachefs/trace.h b/fs/bcachefs/trace.h
index 65c38aa38359..a52da91f279e 100644
--- a/fs/bcachefs/trace.h
+++ b/fs/bcachefs/trace.h
@@ -755,6 +755,12 @@ DEFINE_EVENT(transaction_event, trans_restart_key_cache_raced,
TP_ARGS(trans_fn, caller_ip)
);
+DEFINE_EVENT(transaction_event, trans_restart_too_many_iters,
+ TP_PROTO(const char *trans_fn,
+ unsigned long caller_ip),
+ TP_ARGS(trans_fn, caller_ip)
+);
+
DECLARE_EVENT_CLASS(transaction_restart_iter,
TP_PROTO(const char *trans_fn,
unsigned long caller_ip,