bcachefs: bch2_time_stats_reset()
authorKent Overstreet <kent.overstreet@linux.dev>
Mon, 19 Aug 2024 19:33:38 +0000 (15:33 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Mon, 9 Sep 2024 13:41:49 +0000 (09:41 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/sysfs.c
fs/bcachefs/time_stats.c
fs/bcachefs/time_stats.h

index 7ff9afcb37b2c17fbb152785a7c4f40afb1855a4..6791540d6a4aa2baddd72d3073bf0014d1c039a2 100644 (file)
@@ -233,7 +233,7 @@ write_attribute(perf_test);
 
 #define x(_name)                                               \
        static struct attribute sysfs_time_stat_##_name =               \
-               { .name = #_name, .mode = 0444 };
+               { .name = #_name, .mode = 0644 };
        BCH_TIME_STATS()
 #undef x
 
@@ -722,6 +722,13 @@ SHOW(bch2_fs_time_stats)
 
 STORE(bch2_fs_time_stats)
 {
+       struct bch_fs *c = container_of(kobj, struct bch_fs, time_stats);
+
+#define x(name)                                                                \
+       if (attr == &sysfs_time_stat_##name)                            \
+               bch2_time_stats_reset(&c->times[BCH_TIME_##name]);
+       BCH_TIME_STATS()
+#undef x
        return size;
 }
 SYSFS_OPS(bch2_fs_time_stats);
index 4508e9dcbee224b5a330a8941f8f9f279939b23d..3fe82757f93aacc83c4989b6dfc0b8b4af23acd2 100644 (file)
@@ -151,6 +151,20 @@ void __bch2_time_stats_update(struct bch2_time_stats *stats, u64 start, u64 end)
        }
 }
 
+void bch2_time_stats_reset(struct bch2_time_stats *stats)
+{
+       spin_lock_irq(&stats->lock);
+       unsigned offset = offsetof(struct bch2_time_stats, min_duration);
+       memset((void *) stats + offset, 0, sizeof(*stats) - offset);
+
+       if (stats->buffer) {
+               int cpu;
+               for_each_possible_cpu(cpu)
+                       per_cpu_ptr(stats->buffer, cpu)->nr = 0;
+       }
+       spin_unlock_irq(&stats->lock);
+}
+
 void bch2_time_stats_exit(struct bch2_time_stats *stats)
 {
        free_percpu(stats->buffer);
index 5df61403744b1af43a1794942a706f5550d97bd3..dc6493f7bbabc69955c44481d46a58a3a5bc1e1a 100644 (file)
@@ -70,6 +70,7 @@ struct time_stat_buffer {
 struct bch2_time_stats {
        spinlock_t      lock;
        bool            have_quantiles;
+       struct time_stat_buffer __percpu *buffer;
        /* all fields are in nanoseconds */
        u64             min_duration;
        u64             max_duration;
@@ -87,7 +88,6 @@ struct bch2_time_stats {
 
        struct mean_and_variance_weighted duration_stats_weighted;
        struct mean_and_variance_weighted freq_stats_weighted;
-       struct time_stat_buffer __percpu *buffer;
 };
 
 struct bch2_time_stats_quantiles {
@@ -142,6 +142,7 @@ static inline bool track_event_change(struct bch2_time_stats *stats, bool v)
        return false;
 }
 
+void bch2_time_stats_reset(struct bch2_time_stats *);
 void bch2_time_stats_exit(struct bch2_time_stats *);
 void bch2_time_stats_init(struct bch2_time_stats *);