bcachefs: Btree key cache optimization
authorKent Overstreet <kent.overstreet@linux.dev>
Wed, 4 Jan 2023 09:34:16 +0000 (04:34 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:24 +0000 (17:09 -0400)
This helps with lock contention in the journalling code: instead of
updating our journal pin on every write, only get a journal pin if we
don't have one.

This means we can avoid hammering on journal locks nearly so much, at
the cost of carrying around a journal pin for an older entry than the
one we actually need. To handle that, if needed we update our journal
pin to the correct one when flushed by journal reclaim.

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

index 1841760237ecd118329c339394736e374a24edf9..70f31b5379e7077724a93854dd23c2be1b8575cd 100644 (file)
@@ -487,6 +487,13 @@ int bch2_btree_key_cache_journal_flush(struct journal *j,
                six_unlock_read(&ck->c.lock);
                goto unlock;
        }
+
+       if (ck->seq != seq) {
+               bch2_journal_pin_update(&c->journal, ck->seq, &ck->journal,
+                                       bch2_btree_key_cache_journal_flush);
+               six_unlock_read(&ck->c.lock);
+               goto unlock;
+       }
        six_unlock_read(&ck->c.lock);
 
        ret = bch2_trans_do(c, NULL, NULL, 0,
@@ -547,8 +554,9 @@ bool bch2_btree_insert_key_cached(struct btree_trans *trans,
                        kick_reclaim = true;
        }
 
-       bch2_journal_pin_update(&c->journal, trans->journal_res.seq,
-                               &ck->journal, bch2_btree_key_cache_journal_flush);
+       bch2_journal_pin_add(&c->journal, trans->journal_res.seq,
+                            &ck->journal, bch2_btree_key_cache_journal_flush);
+       ck->seq = trans->journal_res.seq;
 
        if (kick_reclaim)
                journal_reclaim_kick(&c->journal);
index 89c0d2272d9109c1ed821cce8c075b80236eb964..d5c2a776ee1b8f3f22dbcd269236282eed9b9742 100644 (file)
@@ -332,6 +332,7 @@ struct bkey_cached {
 
        struct journal_preres   res;
        struct journal_entry_pin journal;
+       u64                     seq;
 
        struct bkey_i           *k;
 };