]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
bcachefs: Don't set btree nodes as accessed on fill
authorKent Overstreet <kent.overstreet@linux.dev>
Tue, 13 May 2025 18:27:01 +0000 (14:27 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Wed, 14 May 2025 21:05:19 +0000 (17:05 -0400)
Prevent jobs that do lots of scanning (i.e. evacuatee, scrub) from
causing OOMs.

The shrinker code seems to be having issues when it doesn't do any
freeing because it's just flipping off the acccessed bit - and the
accessed bit shouldn't be set on first use anyways.

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

index 9b80201c7982f5664080bdf154fcb58496fd93eb..89989129579728e3e642ec81c31fe3756abc73ce 100644 (file)
@@ -852,7 +852,6 @@ out:
        b->sib_u64s[1]          = 0;
        b->whiteout_u64s        = 0;
        bch2_btree_keys_init(b);
-       set_btree_node_accessed(b);
 
        bch2_time_stats_update(&c->times[BCH_TIME_btree_node_mem_alloc],
                               start_time);
@@ -1286,6 +1285,10 @@ lock_node:
                        six_unlock_read(&b->c.lock);
                        goto retry;
                }
+
+               /* avoid atomic set bit if it's not needed: */
+               if (!btree_node_accessed(b))
+                       set_btree_node_accessed(b);
        }
 
        /* XXX: waiting on IO with btree locks held: */
@@ -1301,10 +1304,6 @@ lock_node:
                prefetch(p + L1_CACHE_BYTES * 2);
        }
 
-       /* avoid atomic set bit if it's not needed: */
-       if (!btree_node_accessed(b))
-               set_btree_node_accessed(b);
-
        if (unlikely(btree_node_read_error(b))) {
                six_unlock_read(&b->c.lock);
                b = ERR_PTR(-BCH_ERR_btree_node_read_err_cached);