summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2024-08-10 20:40:09 +0200
committerKent Overstreet <kent.overstreet@linux.dev>2024-08-14 05:00:34 +0200
commit7254555c440ff6b136aa97fb3c33fd5e0bb4fb9f (patch)
treecbd1d05109b68ad910a4f5133c780be31ae7b71e /fs
parentlib/generic-radix-tree.c: Fix rare race in __genradix_ptr_alloc() (diff)
downloadlinux-7254555c440ff6b136aa97fb3c33fd5e0bb4fb9f.tar.xz
linux-7254555c440ff6b136aa97fb3c33fd5e0bb4fb9f.zip
bcachefs: Add hysteresis to waiting on btree key cache flush
This helps ensure key cache reclaim isn't contending with threads waiting for the key cache to be helped, and fixes a severe performance bug. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs')
-rw-r--r--fs/bcachefs/btree_key_cache.h9
-rw-r--r--fs/bcachefs/btree_trans_commit.c2
2 files changed, 10 insertions, 1 deletions
diff --git a/fs/bcachefs/btree_key_cache.h b/fs/bcachefs/btree_key_cache.h
index e6b2cd0dd2c1..113309f62918 100644
--- a/fs/bcachefs/btree_key_cache.h
+++ b/fs/bcachefs/btree_key_cache.h
@@ -20,6 +20,15 @@ static inline bool bch2_btree_key_cache_must_wait(struct bch_fs *c)
return nr_dirty > max_dirty;
}
+static inline bool bch2_btree_key_cache_wait_done(struct bch_fs *c)
+{
+ size_t nr_dirty = atomic_long_read(&c->btree_key_cache.nr_dirty);
+ size_t nr_keys = atomic_long_read(&c->btree_key_cache.nr_keys);
+ size_t max_dirty = 2048 + (nr_keys * 5) / 8;
+
+ return nr_dirty <= max_dirty;
+}
+
int bch2_btree_key_cache_journal_flush(struct journal *,
struct journal_entry_pin *, u64);
diff --git a/fs/bcachefs/btree_trans_commit.c b/fs/bcachefs/btree_trans_commit.c
index cca336fe46e9..f567bfb82850 100644
--- a/fs/bcachefs/btree_trans_commit.c
+++ b/fs/bcachefs/btree_trans_commit.c
@@ -927,7 +927,7 @@ static inline int do_bch2_trans_commit(struct btree_trans *trans, unsigned flags
static int journal_reclaim_wait_done(struct bch_fs *c)
{
int ret = bch2_journal_error(&c->journal) ?:
- !bch2_btree_key_cache_must_wait(c);
+ bch2_btree_key_cache_wait_done(c);
if (!ret)
journal_reclaim_kick(&c->journal);