]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
bcachefs: Fix reporting of freed objects from key cache shrinker
authorKent Overstreet <kent.overstreet@linux.dev>
Fri, 7 Jun 2024 00:01:34 +0000 (20:01 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Mon, 10 Jun 2024 17:17:16 +0000 (13:17 -0400)
We count objects as freed when we move them to the srcu-pending lists
because we're doing the equivalent of a kfree_srcu(); the only
difference is managing the pending list ourself means we can allocate
from the pending list.

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

index eaf012ddca08ca48b87f1eda5aa75c30a2510edb..2ad3d27c91e6fe5bd3647586e08e51ed2b4b592a 100644 (file)
@@ -841,7 +841,6 @@ static unsigned long bch2_btree_key_cache_scan(struct shrinker *shrink,
                six_lock_exit(&ck->c.lock);
                kmem_cache_free(bch2_key_cache, ck);
                atomic_long_dec(&bc->nr_freed);
-               freed++;
                bc->nr_freed_nonpcpu--;
                bc->freed++;
        }
@@ -855,7 +854,6 @@ static unsigned long bch2_btree_key_cache_scan(struct shrinker *shrink,
                six_lock_exit(&ck->c.lock);
                kmem_cache_free(bch2_key_cache, ck);
                atomic_long_dec(&bc->nr_freed);
-               freed++;
                bc->nr_freed_pcpu--;
                bc->freed++;
        }
@@ -877,23 +875,22 @@ static unsigned long bch2_btree_key_cache_scan(struct shrinker *shrink,
 
                        if (test_bit(BKEY_CACHED_DIRTY, &ck->flags)) {
                                bc->skipped_dirty++;
-                               goto next;
                        } else if (test_bit(BKEY_CACHED_ACCESSED, &ck->flags)) {
                                clear_bit(BKEY_CACHED_ACCESSED, &ck->flags);
                                bc->skipped_accessed++;
-                               goto next;
-                       } else if (bkey_cached_lock_for_evict(ck)) {
+                       } else if (!bkey_cached_lock_for_evict(ck)) {
+                               bc->skipped_lock_fail++;
+                       } else {
                                bkey_cached_evict(bc, ck);
                                bkey_cached_free(bc, ck);
                                bc->moved_to_freelist++;
-                       } else {
-                               bc->skipped_lock_fail++;
+                               freed++;
                        }
 
                        scanned++;
                        if (scanned >= nr)
                                break;
-next:
+
                        pos = next;
                }