summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2016-10-24 12:55:58 -0800
committerKent Overstreet <kent.overstreet@gmail.com>2016-11-02 20:50:43 -0800
commit4049f4305e03fcb31d936273e93a93b701dd7fe3 (patch)
treedca503ba7837eeed767eb45691226ddb8c610f15
parentdabb5857b86b2e0dff31de66db795f7edd556866 (diff)
bcache: reduce bch_bkey_to_bset() calls
-rw-r--r--drivers/md/bcache/bset.c7
-rw-r--r--drivers/md/bcache/bset.h8
-rw-r--r--drivers/md/bcache/btree_iter.c13
-rw-r--r--drivers/md/bcache/btree_iter.h4
-rw-r--r--drivers/md/bcache/btree_update.c14
-rw-r--r--drivers/md/bcache/extents.c26
6 files changed, 42 insertions, 30 deletions
diff --git a/drivers/md/bcache/bset.c b/drivers/md/bcache/bset.c
index 4940d961755f..11b5a2b1547d 100644
--- a/drivers/md/bcache/bset.c
+++ b/drivers/md/bcache/bset.c
@@ -827,9 +827,9 @@ struct bkey_packed *bkey_prev(struct bset_tree *t, struct bkey_packed *k)
* modified, fix any auxiliary search tree by remaking all the nodes in the
* auxiliary search tree that @k corresponds to
*/
-void bch_bset_fix_invalidated_key(struct btree_keys *b, struct bkey_packed *k)
+void bch_bset_fix_invalidated_key(struct btree_keys *b, struct bset_tree *t,
+ struct bkey_packed *k)
{
- struct bset_tree *t = bch_bkey_to_bset(b, k);
unsigned inorder, j = 1;
if (!bset_has_aux_tree(t))
@@ -997,6 +997,7 @@ struct bkey_packed *bch_bset_insert(struct btree_keys *b,
/* @where must compare equal to @insert */
bool bch_bset_try_overwrite(struct btree_keys *b,
struct btree_node_iter *iter,
+ struct bset_tree *t,
struct bkey_packed *where,
struct bkey_i *insert)
{
@@ -1009,7 +1010,7 @@ bool bch_bset_try_overwrite(struct btree_keys *b,
if (bkey_deleted(&insert->k))
return false;
- if (bch_bkey_to_bset(b, where) != bset_tree_last(b))
+ if (t != bset_tree_last(b))
return false;
if (where->u64s == src->u64s)
diff --git a/drivers/md/bcache/bset.h b/drivers/md/bcache/bset.h
index bf136be0873f..3cd5f41244f1 100644
--- a/drivers/md/bcache/bset.h
+++ b/drivers/md/bcache/bset.h
@@ -318,13 +318,15 @@ void bch_btree_keys_init(struct btree_keys *, const struct btree_keys_ops *,
void bch_bset_init_first(struct btree_keys *, struct bset *);
void bch_bset_init_next(struct btree_keys *, struct bset *);
void bch_bset_build_written_tree(struct btree_keys *);
-void bch_bset_fix_invalidated_key(struct btree_keys *, struct bkey_packed *);
+void bch_bset_fix_invalidated_key(struct btree_keys *, struct bset_tree *,
+ struct bkey_packed *);
struct bkey_packed *bch_bset_insert(struct btree_keys *,
struct btree_node_iter *,
struct bkey_i *);
-bool bch_bset_try_overwrite(struct btree_keys *, struct btree_node_iter *iter,
- struct bkey_packed *, struct bkey_i *);
+bool bch_bset_try_overwrite(struct btree_keys *, struct btree_node_iter *,
+ struct bset_tree *, struct bkey_packed *,
+ struct bkey_i *);
static inline void btree_keys_account_key(struct btree_nr_keys *n,
struct bkey_packed *k,
diff --git a/drivers/md/bcache/btree_iter.c b/drivers/md/bcache/btree_iter.c
index 8d2e7636ebda..980fd645734a 100644
--- a/drivers/md/bcache/btree_iter.c
+++ b/drivers/md/bcache/btree_iter.c
@@ -244,12 +244,12 @@ void bch_btree_iter_verify(struct btree_iter *iter, struct btree *b)
static void __bch_btree_node_iter_fix(struct btree_iter *iter,
struct btree_keys *b,
struct btree_node_iter *node_iter,
+ struct bset_tree *t,
struct bkey_packed *where,
bool overwrote)
{
struct bkey_format *f = &b->format;
- struct bset *i = bch_bkey_to_bset(b, where)->data;
- const struct bkey_packed *end = bset_bkey_last(i);
+ const struct bkey_packed *end = bset_bkey_last(t->data);
struct btree_node_iter_set *set;
unsigned shift = overwrote ? 0 : where->u64s;
unsigned offset = __btree_node_key_to_offset(b, where);
@@ -304,24 +304,25 @@ check_remove:
void bch_btree_node_iter_fix(struct btree_iter *iter,
struct btree *b,
struct btree_node_iter *node_iter,
- struct bkey_packed *k,
+ struct bset_tree *t,
+ struct bkey_packed *where,
bool overwrote)
{
struct btree_iter *linked;
if (node_iter != &iter->node_iters[b->level])
__bch_btree_node_iter_fix(iter, &b->keys, node_iter,
- k, overwrote);
+ t, where, overwrote);
if (iter->nodes[b->level] == b)
__bch_btree_node_iter_fix(iter, &b->keys,
&iter->node_iters[b->level],
- k, overwrote);
+ t, where, overwrote);
for_each_linked_btree_node(iter, b, linked)
__bch_btree_node_iter_fix(linked, &b->keys,
&linked->node_iters[b->level],
- k, overwrote);
+ t, where, overwrote);
bch_btree_iter_verify(iter, b);
}
diff --git a/drivers/md/bcache/btree_iter.h b/drivers/md/bcache/btree_iter.h
index c0031d99b3dc..9539734fdadc 100644
--- a/drivers/md/bcache/btree_iter.h
+++ b/drivers/md/bcache/btree_iter.h
@@ -122,8 +122,8 @@ static inline void bch_btree_iter_verify(struct btree_iter *iter,
#endif
void bch_btree_node_iter_fix(struct btree_iter *, struct btree *,
- struct btree_node_iter *, struct bkey_packed *,
- bool);
+ struct btree_node_iter *, struct bset_tree *,
+ struct bkey_packed *, bool);
bool bch_btree_iter_upgrade(struct btree_iter *);
int bch_btree_iter_unlock(struct btree_iter *);
diff --git a/drivers/md/bcache/btree_update.c b/drivers/md/bcache/btree_update.c
index 5163733c80cf..55b631eb21e6 100644
--- a/drivers/md/bcache/btree_update.c
+++ b/drivers/md/bcache/btree_update.c
@@ -658,7 +658,9 @@ void bch_btree_bset_insert(struct btree_iter *iter,
where = bch_bset_insert(&b->keys, node_iter, insert);
- bch_btree_node_iter_fix(iter, b, node_iter, where, false);
+ bch_btree_node_iter_fix(iter, b, node_iter,
+ bset_tree_last(&b->keys),
+ where, false);
}
/* Handle overwrites and do insert, for non extents: */
@@ -669,20 +671,22 @@ void bch_btree_bset_insert_key(struct btree_iter *iter,
{
const struct bkey_format *f = &b->keys.format;
struct bkey_packed *k;
+ struct bset_tree *t;
k = bch_btree_node_iter_peek_all(node_iter, &b->keys);
if (k && !bkey_cmp_packed(f, k, &insert->k)) {
- if (bch_bset_try_overwrite(&b->keys, node_iter, k, insert)) {
+ t = bch_bkey_to_bset(&b->keys, k);
+
+ if (bch_bset_try_overwrite(&b->keys, node_iter, t, k, insert)) {
bch_btree_iter_verify(iter, b);
return;
}
k->type = KEY_TYPE_DELETED;
btree_keys_account_key_drop(&b->keys.nr, k);
- bch_btree_node_iter_fix(iter, b, node_iter, k, true);
+ bch_btree_node_iter_fix(iter, b, node_iter, t, k, true);
- if (bkey_deleted(&insert->k) &&
- bch_bkey_to_bset(&b->keys, k) == bset_tree_last(&b->keys))
+ if (t == bset_tree_last(&b->keys) && bkey_deleted(&insert->k))
return;
}
diff --git a/drivers/md/bcache/extents.c b/drivers/md/bcache/extents.c
index 02cb01a795c9..1549555dea66 100644
--- a/drivers/md/bcache/extents.c
+++ b/drivers/md/bcache/extents.c
@@ -1326,6 +1326,7 @@ bch_insert_fixup_extent(struct btree_insert *trans,
(ret = extent_insert_should_stop(trans, insert, res,
start_time, nr_done)) == BTREE_INSERT_OK &&
(_k = bch_btree_node_iter_peek_all(node_iter, &b->keys))) {
+ struct bset_tree *t = bch_bkey_to_bset(&b->keys, _k);
struct bkey_s k = __bkey_disassemble(f, _k, &unpacked);
enum bch_extent_overlap overlap;
@@ -1401,8 +1402,8 @@ bch_insert_fixup_extent(struct btree_insert *trans,
* key and we've just changed the end, update the
* auxiliary tree.
*/
- bch_bset_fix_invalidated_key(&b->keys, _k);
- bch_btree_node_iter_fix(iter, b, node_iter, _k, true);
+ bch_bset_fix_invalidated_key(&b->keys, t, _k);
+ bch_btree_node_iter_fix(iter, b, node_iter, t, _k, true);
break;
case BCH_EXTENT_OVERLAP_ALL: {
@@ -1441,8 +1442,9 @@ bch_insert_fixup_extent(struct btree_insert *trans,
*/
EBUG_ON(bkey_cmp(committed_pos, k.k->p));
} else {
- bch_bset_fix_invalidated_key(&b->keys, _k);
- bch_btree_node_iter_fix(iter, b, node_iter, _k, true);
+ bch_bset_fix_invalidated_key(&b->keys, t, _k);
+ bch_btree_node_iter_fix(iter, b, node_iter, t,
+ _k, true);
}
break;
@@ -2152,6 +2154,7 @@ static void extent_i_save(struct btree_keys *b, struct btree_node_iter *iter,
static bool extent_merge_one_overlapping(struct btree_iter *iter,
struct bpos new_pos,
+ struct bset_tree *t,
struct bkey_packed *k, struct bkey uk,
bool check, bool could_pack)
{
@@ -2165,8 +2168,8 @@ static bool extent_merge_one_overlapping(struct btree_iter *iter,
} else {
uk.p = new_pos;
extent_save(&b->keys, node_iter, k, &uk);
- bch_bset_fix_invalidated_key(&b->keys, k);
- bch_btree_node_iter_fix(iter, b, node_iter, k, true);
+ bch_bset_fix_invalidated_key(&b->keys, t, k);
+ bch_btree_node_iter_fix(iter, b, node_iter, t, k, true);
return true;
}
}
@@ -2220,7 +2223,7 @@ do_fixup:
continue;
if (!extent_merge_one_overlapping(iter, new_pos,
- k, uk, check, could_pack))
+ t, k, uk, check, could_pack))
return false;
}
} else {
@@ -2235,7 +2238,7 @@ do_fixup:
continue;
if (!extent_merge_one_overlapping(iter, new_pos,
- k, uk, check, could_pack))
+ t, k, uk, check, could_pack))
return false;
}
}
@@ -2265,6 +2268,7 @@ static bool bch_extent_merge_inline(struct btree_iter *iter,
struct btree_keys *b = &iter->nodes[0]->keys;
struct btree_node_iter *node_iter = &iter->node_iters[0];
const struct bkey_format *f = &b->format;
+ struct bset_tree *t = bset_tree_last(b);
struct bkey_packed *m;
BKEY_PADDED(k) li;
BKEY_PADDED(k) ri;
@@ -2282,7 +2286,7 @@ static bool bch_extent_merge_inline(struct btree_iter *iter,
mi = back_merge ? &li.k : &ri.k;
/* l & r should be in last bset: */
- EBUG_ON(bch_bkey_to_bset(b, m) != bset_tree_last(b));
+ EBUG_ON(bch_bkey_to_bset(b, m) != t);
switch (bch_extent_merge(b, &li.k, &ri.k)) {
case BCH_MERGE_NOMERGE:
@@ -2305,7 +2309,7 @@ static bool bch_extent_merge_inline(struct btree_iter *iter,
bch_btree_iter_set_pos_same_leaf(iter, li.k.k.p);
bch_btree_node_iter_fix(iter, iter->nodes[0], node_iter,
- m, true);
+ t, m, true);
if (!back_merge)
bkey_copy(packed_to_bkey(l), &li.k);
@@ -2321,7 +2325,7 @@ static bool bch_extent_merge_inline(struct btree_iter *iter,
extent_i_save(b, node_iter, m, &li.k);
bch_btree_node_iter_fix(iter, iter->nodes[0], node_iter,
- m, true);
+ t, m, true);
return true;
default:
BUG();