summaryrefslogtreecommitdiff
path: root/fs/bcachefs
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-12-28 04:45:07 +0300
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-23 00:09:20 +0300
commitc7ce813fe49a58344ba11219c0bd3a2fdb2e8b9e (patch)
tree7313f7c84a4578da61d9ac25836cf36fd5b13c93 /fs/bcachefs
parentd93cf6858fe67a84e90af76994a2fe4b390c0a0b (diff)
downloadlinux-c7ce813fe49a58344ba11219c0bd3a2fdb2e8b9e.tar.xz
bcachefs: Add a tracepoint for the btree cache shrinker
This is to help with diagnosing why the btree node can doesn't seem to be shrinking - we've had issues in the past with granularity/batch size, since btree nodes are so big. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Diffstat (limited to 'fs/bcachefs')
-rw-r--r--fs/bcachefs/btree_cache.c11
-rw-r--r--fs/bcachefs/trace.h28
2 files changed, 37 insertions, 2 deletions
diff --git a/fs/bcachefs/btree_cache.c b/fs/bcachefs/btree_cache.c
index 5bf493a315ca..40061887f5d8 100644
--- a/fs/bcachefs/btree_cache.c
+++ b/fs/bcachefs/btree_cache.c
@@ -275,6 +275,7 @@ static unsigned long bch2_btree_cache_scan(struct shrinker *shrink,
unsigned long touched = 0;
unsigned long freed = 0;
unsigned i, flags;
+ unsigned long ret = SHRINK_STOP;
if (bch2_btree_shrinker_disabled)
return SHRINK_STOP;
@@ -283,7 +284,7 @@ static unsigned long bch2_btree_cache_scan(struct shrinker *shrink,
if (sc->gfp_mask & __GFP_FS)
mutex_lock(&bc->lock);
else if (!mutex_trylock(&bc->lock))
- return -1;
+ goto out_norestore;
flags = memalloc_nofs_save();
@@ -358,8 +359,14 @@ restart:
mutex_unlock(&bc->lock);
out:
+ ret = (unsigned long) freed * btree_pages(c);
memalloc_nofs_restore(flags);
- return (unsigned long) freed * btree_pages(c);
+out_norestore:
+ trace_btree_cache_scan(sc->nr_to_scan,
+ sc->nr_to_scan / btree_pages(c),
+ btree_cache_can_free(bc),
+ ret);
+ return ret;
}
static unsigned long bch2_btree_cache_count(struct shrinker *shrink,
diff --git a/fs/bcachefs/trace.h b/fs/bcachefs/trace.h
index 21d026277540..a1122fa3ccc6 100644
--- a/fs/bcachefs/trace.h
+++ b/fs/bcachefs/trace.h
@@ -318,6 +318,34 @@ DEFINE_EVENT(btree_node, btree_set_root,
TP_ARGS(c, b)
);
+TRACE_EVENT(btree_cache_scan,
+ TP_PROTO(unsigned long nr_to_scan_pages,
+ unsigned long nr_to_scan_nodes,
+ unsigned long can_free_nodes,
+ long ret),
+ TP_ARGS(nr_to_scan_pages, nr_to_scan_nodes, can_free_nodes, ret),
+
+ TP_STRUCT__entry(
+ __field(unsigned long, nr_to_scan_pages )
+ __field(unsigned long, nr_to_scan_nodes )
+ __field(unsigned long, can_free_nodes )
+ __field(long, ret )
+ ),
+
+ TP_fast_assign(
+ __entry->nr_to_scan_pages = nr_to_scan_pages;
+ __entry->nr_to_scan_nodes = nr_to_scan_nodes;
+ __entry->can_free_nodes = can_free_nodes;
+ __entry->ret = ret;
+ ),
+
+ TP_printk("scanned for %lu pages, %lu nodes, can free %lu nodes, ret %li",
+ __entry->nr_to_scan_pages,
+ __entry->nr_to_scan_nodes,
+ __entry->can_free_nodes,
+ __entry->ret)
+);
+
/* Garbage collection */
DEFINE_EVENT(btree_node, btree_gc_rewrite_node,