diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2018-03-28 06:46:47 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2018-05-22 00:44:18 -0400 |
commit | e8666d1c62b07bd85a7ba541670a75e71037c590 (patch) | |
tree | aeb97cebe94f4416fe82b703ae2a0afe6f865e36 | |
parent | 9aea445fd70609f178ec5aedc1f4572af7ca24a9 (diff) |
bcachefs: add a cond_resched() to __bch2_btree_iter_next()
-rw-r--r-- | fs/bcachefs/btree_iter.h | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/fs/bcachefs/btree_iter.h b/fs/bcachefs/btree_iter.h index 318b04242d52..95191ba2bc79 100644 --- a/fs/bcachefs/btree_iter.h +++ b/fs/bcachefs/btree_iter.h @@ -231,6 +231,20 @@ static inline int btree_iter_cmp(const struct btree_iter *l, return __btree_iter_cmp(l->btree_id, l->pos, r); } +/* + * Unlocks before scheduling + * Note: does not revalidate iterator + */ +static inline void bch2_btree_iter_cond_resched(struct btree_iter *iter) +{ + if (need_resched()) { + bch2_btree_iter_unlock(iter); + schedule(); + } else if (race_fault()) { + bch2_btree_iter_unlock(iter); + } +} + #define __for_each_btree_node(_iter, _c, _btree_id, _start, \ _locks_want, _depth, _flags, _b) \ for (__bch2_btree_iter_init((_iter), (_c), (_btree_id), _start, \ @@ -253,6 +267,8 @@ static inline struct bkey_s_c __bch2_btree_iter_peek(struct btree_iter *iter, static inline struct bkey_s_c __bch2_btree_iter_next(struct btree_iter *iter, unsigned flags) { + bch2_btree_iter_cond_resched(iter); + return flags & BTREE_ITER_SLOTS ? bch2_btree_iter_next_slot(iter) : bch2_btree_iter_next(iter); @@ -275,18 +291,4 @@ static inline int btree_iter_err(struct bkey_s_c k) return PTR_ERR_OR_ZERO(k.k); } -/* - * Unlocks before scheduling - * Note: does not revalidate iterator - */ -static inline void bch2_btree_iter_cond_resched(struct btree_iter *iter) -{ - if (need_resched()) { - bch2_btree_iter_unlock(iter); - schedule(); - } else if (race_fault()) { - bch2_btree_iter_unlock(iter); - } -} - #endif /* _BCACHEFS_BTREE_ITER_H */ |