aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-04-27 14:02:00 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:09:02 -0400
commitbaa6502905df0acb94afbf6c93f51a1f2aa4c7ca (patch)
tree083b06b2a86cbc6576abe4fff28684538af239af
parentbcachefs: Call bch2_inconsistent_error() on missing stripe/indirect extent (diff)
downloadwireguard-linux-baa6502905df0acb94afbf6c93f51a1f2aa4c7ca.tar.xz
wireguard-linux-baa6502905df0acb94afbf6c93f51a1f2aa4c7ca.zip
bcachefs: Change bch2_btree_key_cache_count() to exclude dirty keys
We're seeing livelocks that appear to be due to bch2_btree_key_cache_scan repeatedly scanning and blocking other tasks from using the key cache lock - we probably shouldn't be reporting objects that can't actually be freed yet. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r--fs/bcachefs/btree_key_cache.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/fs/bcachefs/btree_key_cache.c b/fs/bcachefs/btree_key_cache.c
index f8b9ca4dfb2b..221cb0f46db0 100644
--- a/fs/bcachefs/btree_key_cache.c
+++ b/fs/bcachefs/btree_key_cache.c
@@ -646,8 +646,10 @@ static unsigned long bch2_btree_key_cache_count(struct shrinker *shrink,
struct bch_fs *c = container_of(shrink, struct bch_fs,
btree_key_cache.shrink);
struct btree_key_cache *bc = &c->btree_key_cache;
+ long nr = atomic_long_read(&bc->nr_keys) -
+ atomic_long_read(&bc->nr_dirty);
- return atomic_long_read(&bc->nr_keys);
+ return max(0L, nr);
}
void bch2_fs_btree_key_cache_exit(struct btree_key_cache *bc)