diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2016-10-23 02:41:25 -0800 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2017-01-18 21:40:44 -0900 |
commit | 9417155cc0877b0120103c201fe8e5bd5ec5f8cf (patch) | |
tree | 03bae32e99614bb3f56b85eda5dfbaabf924bd65 | |
parent | 5353f305878259894f51a11994b44e451b0775f9 (diff) |
bcache: get rid of a memcmp() in bch_btree_node_get()
-rw-r--r-- | drivers/md/bcache/btree_cache.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/drivers/md/bcache/btree_cache.c b/drivers/md/bcache/btree_cache.c index fbd209081ffd..22dae330acdd 100644 --- a/drivers/md/bcache/btree_cache.c +++ b/drivers/md/bcache/btree_cache.c @@ -51,11 +51,27 @@ static void mca_data_free(struct cache_set *c, struct btree *b) list_move(&b->list, &c->btree_cache_freed); } +#define PTR_HASH(_k) (bkey_i_to_extent_c(_k)->v._data[0]) + +/* + * gcc isn't smart enough to optimize away a memcmp for a constant number of + * bytes :( + */ +static inline int btree_rhash_cmp(struct rhashtable_compare_arg *arg, + const void *obj) +{ + const u64 *v = arg->key; + const struct btree *b = obj; + + return PTR_HASH(&b->key) == *v ? 0 : 1; +} + static const struct rhashtable_params bch_btree_cache_params = { .head_offset = offsetof(struct btree, hash), .key_offset = offsetof(struct btree, key.v), .key_len = sizeof(struct bch_extent_ptr), .hashfn = jhash, + .obj_cmpfn = btree_rhash_cmp, }; static void mca_data_alloc(struct cache_set *c, struct btree *b, gfp_t gfp) @@ -97,8 +113,6 @@ static struct btree *mca_bucket_alloc(struct cache_set *c, gfp_t gfp) /* Btree in memory cache - hash table */ -#define PTR_HASH(_k) (bkey_i_to_extent_c(_k)->v._data[0]) - void mca_hash_remove(struct cache_set *c, struct btree *b) { BUG_ON(btree_node_dirty(b)); |