bcachefs: Improve bucket_alloc_fail tracepoint
authorKent Overstreet <kent.overstreet@gmail.com>
Mon, 18 Jul 2022 01:40:39 +0000 (21:40 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:36 +0000 (17:09 -0400)
We should be printing the number of free buckets, not just the number of
available buckets.

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

index 174b3a745ab8fd5565faea25f7ede167f35f259f..2d44ce2e11de7dacf5698ad20945c579ff13ac53 100644 (file)
@@ -26,6 +26,7 @@
 #include "error.h"
 #include "io.h"
 #include "journal.h"
+#include "movinggc.h"
 #include "trace.h"
 
 #include <linux/math64.h>
@@ -526,7 +527,7 @@ static struct open_bucket *bch2_bucket_alloc_trans(struct btree_trans *trans,
        bool waiting = false;
 again:
        usage = bch2_dev_usage_read(ca);
-       avail = dev_buckets_free(ca, usage,reserve);
+       avail = dev_buckets_free(ca, usage, reserve);
 
        if (usage.d[BCH_DATA_need_discard].buckets > avail)
                bch2_do_discards(c);
@@ -581,14 +582,22 @@ err:
                ob = ERR_PTR(-FREELIST_EMPTY);
 
        if (!IS_ERR(ob)) {
-               trace_bucket_alloc(ca, bch2_alloc_reserves[reserve], avail,
+               trace_bucket_alloc(ca, bch2_alloc_reserves[reserve],
+                                  usage.d[BCH_DATA_free].buckets,
+                                  avail,
+                                  bch2_copygc_wait_amount(c),
+                                  c->copygc_wait - atomic64_read(&c->io_clock[WRITE].now),
                                   buckets_seen,
                                   skipped_open,
                                   skipped_need_journal_commit,
                                   skipped_nouse,
                                   cl == NULL, PTR_ERR_OR_ZERO(ob));
        } else {
-               trace_bucket_alloc_fail(ca, bch2_alloc_reserves[reserve], avail,
+               trace_bucket_alloc_fail(ca, bch2_alloc_reserves[reserve],
+                                  usage.d[BCH_DATA_free].buckets,
+                                  avail,
+                                  bch2_copygc_wait_amount(c),
+                                  c->copygc_wait - atomic64_read(&c->io_clock[WRITE].now),
                                   buckets_seen,
                                   skipped_open,
                                   skipped_need_journal_commit,
index 922738247d03967b439d0ceb75ed451218f6d31d..e85c8136a46e9b7ad52e987c9d299c4d4c9cc581 100644 (file)
@@ -2,6 +2,7 @@
 #ifndef _BCACHEFS_MOVINGGC_H
 #define _BCACHEFS_MOVINGGC_H
 
+unsigned long bch2_copygc_wait_amount(struct bch_fs *);
 void bch2_copygc_stop(struct bch_fs *);
 int bch2_copygc_start(struct bch_fs *);
 void bch2_fs_copygc_init(struct bch_fs *);
index b0ecf18fa1398a85f97cdfa1e85f5c95feaced70..5782952b72a5d0cd0bc87665899df98e8858e3eb 100644 (file)
@@ -440,19 +440,26 @@ DEFINE_EVENT(bch_fs, gc_gens_end,
 
 DECLARE_EVENT_CLASS(bucket_alloc,
        TP_PROTO(struct bch_dev *ca, const char *alloc_reserve,
+                u64 free,
                 u64 avail,
+                u64 copygc_wait_amount,
+                s64 copygc_waiting_for,
                 u64 seen,
                 u64 open,
                 u64 need_journal_commit,
                 u64 nouse,
                 bool nonblocking,
                 int ret),
-       TP_ARGS(ca, alloc_reserve, avail, seen, open, need_journal_commit, nouse, nonblocking, ret),
+       TP_ARGS(ca, alloc_reserve, free, avail, copygc_wait_amount, copygc_waiting_for,
+               seen, open, need_journal_commit, nouse, nonblocking, ret),
 
        TP_STRUCT__entry(
                __field(dev_t,                  dev                     )
                __array(char,   reserve,        16                      )
+               __field(u64,                    free                    )
                __field(u64,                    avail                   )
+               __field(u64,                    copygc_wait_amount      )
+               __field(s64,                    copygc_waiting_for      )
                __field(u64,                    seen                    )
                __field(u64,                    open                    )
                __field(u64,                    need_journal_commit     )
@@ -464,7 +471,10 @@ DECLARE_EVENT_CLASS(bucket_alloc,
        TP_fast_assign(
                __entry->dev            = ca->dev;
                strlcpy(__entry->reserve, alloc_reserve, sizeof(__entry->reserve));
+               __entry->free           = free;
                __entry->avail          = avail;
+               __entry->copygc_wait_amount     = copygc_wait_amount;
+               __entry->copygc_waiting_for     = copygc_waiting_for;
                __entry->seen           = seen;
                __entry->open           = open;
                __entry->need_journal_commit = need_journal_commit;
@@ -473,10 +483,13 @@ DECLARE_EVENT_CLASS(bucket_alloc,
                __entry->ret            = ret;
        ),
 
-       TP_printk("%d,%d reserve %s avail %llu seen %llu open %llu need_journal_commit %llu nouse %llu nonblocking %u ret %i",
+       TP_printk("%d,%d reserve %s free %llu avail %llu copygc_wait %llu/%lli seen %llu open %llu need_journal_commit %llu nouse %llu nonblocking %u ret %i",
                  MAJOR(__entry->dev), MINOR(__entry->dev),
                  __entry->reserve,
+                 __entry->free,
                  __entry->avail,
+                 __entry->copygc_wait_amount,
+                 __entry->copygc_waiting_for,
                  __entry->seen,
                  __entry->open,
                  __entry->need_journal_commit,
@@ -487,26 +500,34 @@ DECLARE_EVENT_CLASS(bucket_alloc,
 
 DEFINE_EVENT(bucket_alloc, bucket_alloc,
        TP_PROTO(struct bch_dev *ca, const char *alloc_reserve,
+                u64 free,
                 u64 avail,
+                u64 copygc_wait_amount,
+                s64 copygc_waiting_for,
                 u64 seen,
                 u64 open,
                 u64 need_journal_commit,
                 u64 nouse,
                 bool nonblocking,
                 int ret),
-       TP_ARGS(ca, alloc_reserve, avail, seen, open, need_journal_commit, nouse, nonblocking, ret)
+       TP_ARGS(ca, alloc_reserve, free, avail, copygc_wait_amount, copygc_waiting_for,
+               seen, open, need_journal_commit, nouse, nonblocking, ret)
 );
 
 DEFINE_EVENT(bucket_alloc, bucket_alloc_fail,
        TP_PROTO(struct bch_dev *ca, const char *alloc_reserve,
+                u64 free,
                 u64 avail,
+                u64 copygc_wait_amount,
+                s64 copygc_waiting_for,
                 u64 seen,
                 u64 open,
                 u64 need_journal_commit,
                 u64 nouse,
                 bool nonblocking,
                 int ret),
-       TP_ARGS(ca, alloc_reserve, avail, seen, open, need_journal_commit, nouse, nonblocking, ret)
+       TP_ARGS(ca, alloc_reserve, free, avail, copygc_wait_amount, copygc_waiting_for,
+               seen, open, need_journal_commit, nouse, nonblocking, ret)
 );
 
 TRACE_EVENT(discard_buckets,