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 9e4ed75..4f5e411 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 34056aa..fb731d5 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 f574867..862b79f 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 10bfb31..eb49dd0 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 *