bcachefs: Have journal reclaim thread flush more aggressively
authorKent Overstreet <kent.overstreet@gmail.com>
Mon, 29 Mar 2021 00:57:59 +0000 (20:57 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:58 +0000 (17:08 -0400)
This adds a new watermark for the journal reclaim when flushing btree
key cache entries - it should try and stay ahead of where foreground
threads doing transaction commits will enter direct journal reclaim.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_key_cache.h
fs/bcachefs/journal_reclaim.c

index 02715cd258ab0e235557adb246d1639ab236b578..4e1e5a9c765614a4cdd3da686f8e657965bf3707 100644 (file)
@@ -1,6 +1,15 @@
 #ifndef _BCACHEFS_BTREE_KEY_CACHE_H
 #define _BCACHEFS_BTREE_KEY_CACHE_H
 
+static inline size_t bch2_nr_btree_keys_want_flush(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 = nr_keys / 4;
+
+       return max_t(ssize_t, 0, nr_dirty - max_dirty);
+}
+
 static inline size_t bch2_nr_btree_keys_need_flush(struct bch_fs *c)
 {
        size_t nr_dirty = atomic_long_read(&c->btree_key_cache.nr_dirty);
index 3957312d12f28a46c42289f37f54a7360f754ca1..17af2bbeadeea1a4634dffda9a45b4912387e473 100644 (file)
@@ -602,7 +602,7 @@ static int __bch2_journal_reclaim(struct journal *j, bool direct)
                if (fifo_free(&j->pin) <= 32)
                        min_nr = 1;
 
-               min_nr = max(min_nr, bch2_nr_btree_keys_need_flush(c));
+               min_nr = max(min_nr, bch2_nr_btree_keys_want_flush(c));
 
                trace_journal_reclaim_start(c,
                                min_nr,