Loading fs/bcachefs/sysfs.c +8 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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); Loading fs/bcachefs/time_stats.c +14 −0 Original line number Diff line number Diff line Loading @@ -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); Loading fs/bcachefs/time_stats.h +2 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 { Loading Loading @@ -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 *); Loading Loading
fs/bcachefs/sysfs.c +8 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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); Loading
fs/bcachefs/time_stats.c +14 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
fs/bcachefs/time_stats.h +2 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 { Loading Loading @@ -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 *); Loading