]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: Add time_stat for btree writes
authorKent Overstreet <kent.overstreet@linux.dev>
Mon, 27 Jan 2025 06:22:42 +0000 (01:22 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 15 Mar 2025 01:02:13 +0000 (21:02 -0400)
We have other metadata IO types covered, this was missing.

Note: this includes the time until completion, i.e. including parent
pointer update.

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

index 9791bfe088958d3c843cd83e06a55e2b76f3b201..e8f4999806b6d2e10f2b1e5efa10d581005ce51f 100644 (file)
@@ -444,6 +444,7 @@ BCH_DEBUG_PARAMS_DEBUG()
        x(btree_node_sort)                      \
        x(btree_node_read)                      \
        x(btree_node_read_done)                 \
+       x(btree_node_write)                     \
        x(btree_interior_update_foreground)     \
        x(btree_interior_update_total)          \
        x(btree_gc)                             \
index 91c624db2958ed5b3400da9cd1c83c22652257e0..18413b4f22a310f2bfe04294017b6edf5e749748 100644 (file)
@@ -2016,7 +2016,7 @@ static void bch2_btree_complete_write(struct bch_fs *c, struct btree *b,
        bch2_journal_pin_drop(&c->journal, &w->journal);
 }
 
-static void __btree_node_write_done(struct bch_fs *c, struct btree *b)
+static void __btree_node_write_done(struct bch_fs *c, struct btree *b, u64 start_time)
 {
        struct btree_write *w = btree_prev_write(b);
        unsigned long old, new;
@@ -2024,6 +2024,9 @@ static void __btree_node_write_done(struct bch_fs *c, struct btree *b)
 
        bch2_btree_complete_write(c, b, w);
 
+       if (start_time)
+               bch2_time_stats_update(&c->times[BCH_TIME_btree_node_write], start_time);
+
        old = READ_ONCE(b->flags);
        do {
                new = old;
@@ -2054,7 +2057,7 @@ static void __btree_node_write_done(struct bch_fs *c, struct btree *b)
                wake_up_bit(&b->flags, BTREE_NODE_write_in_flight);
 }
 
-static void btree_node_write_done(struct bch_fs *c, struct btree *b)
+static void btree_node_write_done(struct bch_fs *c, struct btree *b, u64 start_time)
 {
        struct btree_trans *trans = bch2_trans_get(c);
 
@@ -2062,7 +2065,7 @@ static void btree_node_write_done(struct bch_fs *c, struct btree *b)
 
        /* we don't need transaction context anymore after we got the lock. */
        bch2_trans_put(trans);
-       __btree_node_write_done(c, b);
+       __btree_node_write_done(c, b, start_time);
        six_unlock_read(&b->c.lock);
 }
 
@@ -2072,6 +2075,7 @@ static void btree_node_write_work(struct work_struct *work)
                container_of(work, struct btree_write_bio, work);
        struct bch_fs *c        = wbio->wbio.c;
        struct btree *b         = wbio->wbio.bio.bi_private;
+       u64 start_time          = wbio->start_time;
        int ret = 0;
 
        btree_bounce_free(c,
@@ -2104,7 +2108,7 @@ static void btree_node_write_work(struct work_struct *work)
        }
 out:
        bio_put(&wbio->wbio.bio);
-       btree_node_write_done(c, b);
+       btree_node_write_done(c, b, start_time);
        return;
 err:
        set_btree_node_noevict(b);
@@ -2208,6 +2212,7 @@ void __bch2_btree_node_write(struct bch_fs *c, struct btree *b, unsigned flags)
        bool validate_before_checksum = false;
        enum btree_write_type type = flags & BTREE_WRITE_TYPE_MASK;
        void *data;
+       u64 start_time = local_clock();
        int ret;
 
        if (flags & BTREE_WRITE_ALREADY_STARTED)
@@ -2416,6 +2421,7 @@ do_write:
        wbio->data                      = data;
        wbio->data_bytes                = bytes;
        wbio->sector_offset             = b->written;
+       wbio->start_time                = start_time;
        wbio->wbio.c                    = c;
        wbio->wbio.used_mempool         = used_mempool;
        wbio->wbio.first_btree_write    = !b->written;
@@ -2443,7 +2449,7 @@ err:
        b->written += sectors_to_write;
 nowrite:
        btree_bounce_free(c, bytes, used_mempool, data);
-       __btree_node_write_done(c, b);
+       __btree_node_write_done(c, b, 0);
 }
 
 /*
index 75ead3815d672dd0f2f81c9c04551a79c34aa9cd..dbf76d22c660d897af0efe9de75f0016a823eb80 100644 (file)
@@ -52,6 +52,7 @@ struct btree_write_bio {
        void                    *data;
        unsigned                data_bytes;
        unsigned                sector_offset;
+       u64                     start_time;
        struct bch_write_bio    wbio;
 };