]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: bch2_btree_key_cache_drop() now evicts
authorKent Overstreet <kent.overstreet@linux.dev>
Sat, 8 Jun 2024 19:20:53 +0000 (15:20 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 14 Jul 2024 23:00:16 +0000 (19:00 -0400)
As part of improving btree key cache coherency, the bkey_cached.valid
flag is going away.

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

index 8b2fd0ae602851b4a80f8f1b781b9f521cc283af..88ccf8dbb5a96ab7f14ab84601eaf5c713edbce6 100644 (file)
@@ -792,6 +792,7 @@ void bch2_btree_key_cache_drop(struct btree_trans *trans,
                               struct btree_path *path)
 {
        struct bch_fs *c = trans->c;
+       struct btree_key_cache *bc = &c->btree_key_cache;
        struct bkey_cached *ck = (void *) path->l[0].b;
 
        BUG_ON(!ck->valid);
@@ -806,7 +807,11 @@ void bch2_btree_key_cache_drop(struct btree_trans *trans,
                bch2_journal_pin_drop(&c->journal, &ck->journal);
        }
 
-       ck->valid = false;
+       bkey_cached_evict(bc, ck);
+       bkey_cached_free_fast(bc, ck);
+
+       mark_btree_node_locked(trans, path, 0, BTREE_NODE_UNLOCKED);
+       btree_path_set_dirty(path, BTREE_ITER_NEED_TRAVERSE);
 }
 
 static unsigned long bch2_btree_key_cache_scan(struct shrinker *shrink,
index 8ab85f212f60a8c34e20a60e2595d3b1f124d6fb..cca336fe46e9b44bd887de63c3bbd1aca2f52202 100644 (file)
@@ -137,7 +137,8 @@ static inline void bch2_trans_unlock_write(struct btree_trans *trans)
 {
        if (likely(trans->write_locked)) {
                trans_for_each_update(trans, i)
-                       if (!same_leaf_as_prev(trans, i))
+                       if (btree_node_locked_type(trans->paths + i->path, i->level) ==
+                           BTREE_NODE_WRITE_LOCKED)
                                bch2_btree_node_unlock_write_inlined(trans,
                                                trans->paths + i->path, insert_l(trans, i)->b);
                trans->write_locked = false;
@@ -777,14 +778,12 @@ bch2_trans_commit_write_locked(struct btree_trans *trans, unsigned flags,
        trans_for_each_update(trans, i) {
                struct btree_path *path = trans->paths + i->path;
 
-               if (!i->cached) {
+               if (!i->cached)
                        bch2_btree_insert_key_leaf(trans, path, i->k, trans->journal_res.seq);
-               else if (!i->key_cache_already_flushed)
+               else if (!i->key_cache_already_flushed)
                        bch2_btree_insert_key_cached(trans, flags, i);
-               else {
+               else
                        bch2_btree_key_cache_drop(trans, path);
-                       btree_path_set_dirty(path, BTREE_ITER_NEED_TRAVERSE);
-               }
        }
 
        return 0;