]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
bcachefs: Enable automatic shrinking for rhashtables
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 6 Jun 2024 22:56:59 +0000 (18:56 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Mon, 10 Jun 2024 17:17:16 +0000 (13:17 -0400)
Since the key cache shrinker walks the rhashtable, a mostly empty
rhashtable leads to really nasty reclaim performance issues.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_cache.c
fs/bcachefs/btree_key_cache.c
fs/bcachefs/io_read.c
fs/bcachefs/movinggc.c

index 9e4ed75d3675620736c83dd9c02c86b663117e21..4f5e411771ba1f10df0666fb23fc0c8dcf9ef4ef 100644 (file)
@@ -91,10 +91,11 @@ static int bch2_btree_cache_cmp_fn(struct rhashtable_compare_arg *arg,
 }
 
 static const struct rhashtable_params bch_btree_cache_params = {
-       .head_offset    = offsetof(struct btree, hash),
-       .key_offset     = offsetof(struct btree, hash_val),
-       .key_len        = sizeof(u64),
-       .obj_cmpfn      = bch2_btree_cache_cmp_fn,
+       .head_offset            = offsetof(struct btree, hash),
+       .key_offset             = offsetof(struct btree, hash_val),
+       .key_len                = sizeof(u64),
+       .obj_cmpfn              = bch2_btree_cache_cmp_fn,
+       .automatic_shrinking    = true,
 };
 
 static int btree_node_data_alloc(struct bch_fs *c, struct btree *b, gfp_t gfp)
index 34056aaece009e80c1ef2bd39d304f8b185ce68d..fb731d52b1eccbadb36e041c722ba351b575b56a 100644 (file)
@@ -32,10 +32,11 @@ static int bch2_btree_key_cache_cmp_fn(struct rhashtable_compare_arg *arg,
 }
 
 static const struct rhashtable_params bch2_btree_key_cache_params = {
-       .head_offset    = offsetof(struct bkey_cached, hash),
-       .key_offset     = offsetof(struct bkey_cached, key),
-       .key_len        = sizeof(struct bkey_cached_key),
-       .obj_cmpfn      = bch2_btree_key_cache_cmp_fn,
+       .head_offset            = offsetof(struct bkey_cached, hash),
+       .key_offset             = offsetof(struct bkey_cached, key),
+       .key_len                = sizeof(struct bkey_cached_key),
+       .obj_cmpfn              = bch2_btree_key_cache_cmp_fn,
+       .automatic_shrinking    = true,
 };
 
 __flatten
index f57486794484d9e28f06810ce810e33da5daa37e..862b79f86b91e2ffe17b981ac1eae2a55b34ff1d 100644 (file)
@@ -84,9 +84,10 @@ struct promote_op {
 };
 
 static const struct rhashtable_params bch_promote_params = {
-       .head_offset    = offsetof(struct promote_op, hash),
-       .key_offset     = offsetof(struct promote_op, pos),
-       .key_len        = sizeof(struct bpos),
+       .head_offset            = offsetof(struct promote_op, hash),
+       .key_offset             = offsetof(struct promote_op, pos),
+       .key_len                = sizeof(struct bpos),
+       .automatic_shrinking    = true,
 };
 
 static inline int should_promote(struct bch_fs *c, struct bkey_s_c k,
index 10bfb31c151b208844ff2acc3801bff1d72795c7..eb49dd045eff5c21283c68b81c0c5c160176c0b8 100644 (file)
@@ -35,9 +35,10 @@ struct buckets_in_flight {
 };
 
 static const struct rhashtable_params bch_move_bucket_params = {
-       .head_offset    = offsetof(struct move_bucket_in_flight, hash),
-       .key_offset     = offsetof(struct move_bucket_in_flight, bucket.k),
-       .key_len        = sizeof(struct move_bucket_key),
+       .head_offset            = offsetof(struct move_bucket_in_flight, hash),
+       .key_offset             = offsetof(struct move_bucket_in_flight, bucket.k),
+       .key_len                = sizeof(struct move_bucket_key),
+       .automatic_shrinking    = true,
 };
 
 static struct move_bucket_in_flight *