summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/md/bcache/btree_iter.c14
-rw-r--r--drivers/md/bcache/btree_locking.h2
2 files changed, 9 insertions, 7 deletions
diff --git a/drivers/md/bcache/btree_iter.c b/drivers/md/bcache/btree_iter.c
index e7b97fe6b6e6..02b456169d43 100644
--- a/drivers/md/bcache/btree_iter.c
+++ b/drivers/md/bcache/btree_iter.c
@@ -676,7 +676,7 @@ static inline int btree_iter_lock_root(struct btree_iter *iter,
b = READ_ONCE(c->btree_roots[iter->btree_id].b);
iter->level = READ_ONCE(b->level);
- if (iter->level < depth_want) {
+ if (unlikely(iter->level < depth_want)) {
/*
* the root is at a lower depth than the depth we want:
* got to the end of the btree, or we're walking nodes
@@ -689,13 +689,13 @@ static inline int btree_iter_lock_root(struct btree_iter *iter,
}
lock_type = btree_lock_want(iter, iter->level);
- if (!btree_node_lock(b, POS_MAX, iter->level,
- iter, lock_type))
+ if (unlikely(!btree_node_lock(b, POS_MAX, iter->level,
+ iter, lock_type)))
return -EINTR;
- if (b == c->btree_roots[iter->btree_id].b &&
- b->level == iter->level &&
- !race_fault()) {
+ if (likely(b == c->btree_roots[iter->btree_id].b &&
+ b->level == iter->level &&
+ !race_fault())) {
for (i = 0; i < iter->level; i++)
iter->nodes[i] = BTREE_ITER_NOT_END;
iter->nodes[iter->level] = b;
@@ -1117,6 +1117,8 @@ void __bch_btree_iter_init(struct btree_iter *iter, struct cache_set *c,
memset(iter->nodes, 0, sizeof(iter->nodes));
iter->nodes[iter->level] = BTREE_ITER_NOT_END;
iter->next = iter;
+
+ prefetch(c->btree_roots[btree_id].b);
}
void bch_btree_iter_link(struct btree_iter *iter, struct btree_iter *new)
diff --git a/drivers/md/bcache/btree_locking.h b/drivers/md/bcache/btree_locking.h
index ad0dc3a69b48..76f85c0deae3 100644
--- a/drivers/md/bcache/btree_locking.h
+++ b/drivers/md/bcache/btree_locking.h
@@ -104,7 +104,7 @@ static inline bool btree_node_lock(struct btree *b, struct bpos pos,
struct btree_iter *iter,
enum six_lock_type type)
{
- return six_trylock_type(&b->lock, type) ||
+ return likely(six_trylock_type(&b->lock, type)) ||
__bch_btree_node_lock(b, pos, level, iter, type);
}