diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2016-10-24 12:55:58 -0800 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2016-11-02 20:50:43 -0800 |
commit | 4049f4305e03fcb31d936273e93a93b701dd7fe3 (patch) | |
tree | dca503ba7837eeed767eb45691226ddb8c610f15 | |
parent | dabb5857b86b2e0dff31de66db795f7edd556866 (diff) |
bcache: reduce bch_bkey_to_bset() calls
-rw-r--r-- | drivers/md/bcache/bset.c | 7 | ||||
-rw-r--r-- | drivers/md/bcache/bset.h | 8 | ||||
-rw-r--r-- | drivers/md/bcache/btree_iter.c | 13 | ||||
-rw-r--r-- | drivers/md/bcache/btree_iter.h | 4 | ||||
-rw-r--r-- | drivers/md/bcache/btree_update.c | 14 | ||||
-rw-r--r-- | drivers/md/bcache/extents.c | 26 |
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(); |