diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-09-26 22:21:39 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:08:28 -0400 |
commit | 64bc00115335450c4178fea04c5b664cf73a9729 (patch) | |
tree | 3e491d56806bfa5037273a1dd4fb631a2c8177c7 /fs/bcachefs/btree_iter.h | |
parent | a7199432c3cbcd42141cfd5c047bf8828c2390d8 (diff) | |
download | lwn-64bc00115335450c4178fea04c5b664cf73a9729.tar.gz lwn-64bc00115335450c4178fea04c5b664cf73a9729.zip |
bcachefs: Rework btree iterator lifetimes
The btree_trans struct needs to memoize/cache btree iterators, so that
on transaction restart we don't have to completely redo btree lookups,
and so that we can do them all at once in the correct order when the
transaction had to restart to avoid a deadlock.
This switches the btree iterator lookups to work based on iterator
position, instead of trying to match them up based on the stack trace.
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/btree_iter.h')
-rw-r--r-- | fs/bcachefs/btree_iter.h | 37 |
1 files changed, 12 insertions, 25 deletions
diff --git a/fs/bcachefs/btree_iter.h b/fs/bcachefs/btree_iter.h index 9b5e3de68487..6f81be26e674 100644 --- a/fs/bcachefs/btree_iter.h +++ b/fs/bcachefs/btree_iter.h @@ -271,43 +271,30 @@ static inline int bkey_err(struct bkey_s_c k) 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_on_commit(struct btree_trans *, struct btree_iter *); -void bch2_trans_unlink_iters(struct btree_trans *, u64); +void bch2_trans_unlink_iters(struct btree_trans *); -struct btree_iter *__bch2_trans_get_iter(struct btree_trans *, enum btree_id, - struct bpos, unsigned, u64); +struct btree_iter *bch2_trans_get_iter(struct btree_trans *, enum btree_id, + struct bpos, unsigned); struct btree_iter *bch2_trans_copy_iter(struct btree_trans *, struct btree_iter *); +struct btree_iter *bch2_trans_get_node_iter(struct btree_trans *, + enum btree_id, struct bpos, + unsigned, unsigned, unsigned); -static __always_inline u64 __btree_iter_id(void) -{ - u64 ret = 0; +#define TRANS_RESET_ITERS (1 << 0) +#define TRANS_RESET_MEM (1 << 1) - ret <<= 32; - ret |= _RET_IP_ & U32_MAX; - ret <<= 32; - ret |= _THIS_IP_ & U32_MAX; - return ret; -} +void bch2_trans_reset(struct btree_trans *, unsigned); -static __always_inline struct btree_iter * -bch2_trans_get_iter(struct btree_trans *trans, enum btree_id btree_id, - struct bpos pos, unsigned flags) +static inline void bch2_trans_begin(struct btree_trans *trans) { - return __bch2_trans_get_iter(trans, btree_id, pos, flags, - __btree_iter_id()); + return bch2_trans_reset(trans, TRANS_RESET_ITERS|TRANS_RESET_MEM); } -struct btree_iter *bch2_trans_get_node_iter(struct btree_trans *, - enum btree_id, struct bpos, - unsigned, unsigned, unsigned); - -void bch2_trans_begin(struct btree_trans *); - static inline void bch2_trans_begin_updates(struct btree_trans *trans) { - trans->nr_updates = 0; + return bch2_trans_reset(trans, TRANS_RESET_MEM); } void *bch2_trans_kmalloc(struct btree_trans *, size_t); |