Commit 84841b0d authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet

bcachefs: bch2_dump_trans_iters_updates()

This factors out bch2_dump_trans_iters_updates() from the iter alloc
overflow path, and makes some small improvements to what it prints.
Signed-off-by: default avatarKent Overstreet <kent.overstreet@gmail.com>
parent e6e024e9
...@@ -2256,33 +2256,30 @@ int bch2_trans_iter_free(struct btree_trans *trans, ...@@ -2256,33 +2256,30 @@ int bch2_trans_iter_free(struct btree_trans *trans,
} }
noinline __cold noinline __cold
static void btree_trans_iter_alloc_fail(struct btree_trans *trans) void bch2_dump_trans_iters_updates(struct btree_trans *trans)
{ {
struct btree_iter *iter; struct btree_iter *iter;
struct btree_insert_entry *i; struct btree_insert_entry *i;
unsigned idx; unsigned idx;
char buf[100]; char buf1[300], buf2[100];
btree_trans_sort_iters(trans); btree_trans_sort_iters(trans);
trans_for_each_iter_inorder(trans, iter, idx) trans_for_each_iter_inorder(trans, iter, idx)
printk(KERN_ERR "iter: btree %s pos %s%s%s%s %pS\n", printk(KERN_ERR "iter: btree %s pos %s real_pos %s%s%s%s %pS\n",
bch2_btree_ids[iter->btree_id], bch2_btree_ids[iter->btree_id],
(bch2_bpos_to_text(&PBUF(buf), iter->real_pos), buf), (bch2_bpos_to_text(&PBUF(buf1), iter->pos), buf1),
(bch2_bpos_to_text(&PBUF(buf2), iter->real_pos), buf2),
btree_iter_live(trans, iter) ? " live" : "", btree_iter_live(trans, iter) ? " live" : "",
(trans->iters_touched & (1ULL << iter->idx)) ? " touched" : "", (trans->iters_touched & (1ULL << iter->idx)) ? " touched" : "",
iter->flags & BTREE_ITER_KEEP_UNTIL_COMMIT ? " keep" : "", iter->flags & BTREE_ITER_KEEP_UNTIL_COMMIT ? " keep" : "",
(void *) iter->ip_allocated); (void *) iter->ip_allocated);
trans_for_each_update(trans, i) { trans_for_each_update(trans, i)
char buf[300]; printk(KERN_ERR "update: btree %s %s %pS\n",
bch2_btree_ids[i->btree_id],
bch2_bkey_val_to_text(&PBUF(buf), trans->c, bkey_i_to_s_c(i->k)); (bch2_bkey_val_to_text(&PBUF(buf1), trans->c, bkey_i_to_s_c(i->k)), buf1),
printk(KERN_ERR "update: btree %s %s\n", (void *) i->ip_allocated);
bch2_btree_ids[i->iter->btree_id], buf);
}
panic("trans iter oveflow\n");
} }
static struct btree_iter *btree_trans_iter_alloc(struct btree_trans *trans, static struct btree_iter *btree_trans_iter_alloc(struct btree_trans *trans,
...@@ -2294,8 +2291,10 @@ static struct btree_iter *btree_trans_iter_alloc(struct btree_trans *trans, ...@@ -2294,8 +2291,10 @@ static struct btree_iter *btree_trans_iter_alloc(struct btree_trans *trans,
btree_trans_verify_sorted_refs(trans); btree_trans_verify_sorted_refs(trans);
if (unlikely(trans->iters_linked == if (unlikely(trans->iters_linked ==
~((~0ULL << 1) << (BTREE_ITER_MAX - 1)))) ~((~0ULL << 1) << (BTREE_ITER_MAX - 1)))) {
btree_trans_iter_alloc_fail(trans); bch2_dump_trans_iters_updates(trans);
panic("trans iter oveflow\n");
}
idx = __ffs64(~trans->iters_linked); idx = __ffs64(~trans->iters_linked);
iter = &trans->iters[idx]; iter = &trans->iters[idx];
......
...@@ -295,6 +295,8 @@ static inline int bkey_err(struct bkey_s_c k) ...@@ -295,6 +295,8 @@ static inline int bkey_err(struct bkey_s_c k)
/* new multiple iterator interface: */ /* new multiple iterator interface: */
void bch2_dump_trans_iters_updates(struct btree_trans *);
int bch2_trans_iter_put(struct btree_trans *, struct btree_iter *); int bch2_trans_iter_put(struct btree_trans *, struct btree_iter *);
int bch2_trans_iter_free(struct btree_trans *, struct btree_iter *); int bch2_trans_iter_free(struct btree_trans *, struct btree_iter *);
......
...@@ -348,6 +348,7 @@ struct btree_insert_entry { ...@@ -348,6 +348,7 @@ struct btree_insert_entry {
unsigned trans_triggers_run:1; unsigned trans_triggers_run:1;
struct bkey_i *k; struct bkey_i *k;
struct btree_iter *iter; struct btree_iter *iter;
unsigned long ip_allocated;
}; };
#ifndef CONFIG_LOCKDEP #ifndef CONFIG_LOCKDEP
......
...@@ -1012,7 +1012,8 @@ int bch2_trans_update(struct btree_trans *trans, struct btree_iter *iter, ...@@ -1012,7 +1012,8 @@ int bch2_trans_update(struct btree_trans *trans, struct btree_iter *iter,
.btree_id = iter->btree_id, .btree_id = iter->btree_id,
.level = iter->level, .level = iter->level,
.iter = iter, .iter = iter,
.k = k .k = k,
.ip_allocated = _RET_IP_,
}; };
bool is_extent = (iter->flags & BTREE_ITER_IS_EXTENTS) != 0; bool is_extent = (iter->flags & BTREE_ITER_IS_EXTENTS) != 0;
int ret = 0; int ret = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment