bcachefs: bch2_time_stats_reset()

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
Kent Overstreet 2024-08-19 15:33:38 -04:00
parent b36f679c99
commit fdbc9c390a
3 changed files with 24 additions and 2 deletions

View File

@ -233,7 +233,7 @@ write_attribute(perf_test);
#define x(_name) \ #define x(_name) \
static struct attribute sysfs_time_stat_##_name = \ static struct attribute sysfs_time_stat_##_name = \
{ .name = #_name, .mode = 0444 }; { .name = #_name, .mode = 0644 };
BCH_TIME_STATS() BCH_TIME_STATS()
#undef x #undef x
@ -722,6 +722,13 @@ SHOW(bch2_fs_time_stats)
STORE(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; return size;
} }
SYSFS_OPS(bch2_fs_time_stats); SYSFS_OPS(bch2_fs_time_stats);

View 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) void bch2_time_stats_exit(struct bch2_time_stats *stats)
{ {
free_percpu(stats->buffer); free_percpu(stats->buffer);

View File

@ -70,6 +70,7 @@ struct time_stat_buffer {
struct bch2_time_stats { struct bch2_time_stats {
spinlock_t lock; spinlock_t lock;
bool have_quantiles; bool have_quantiles;
struct time_stat_buffer __percpu *buffer;
/* all fields are in nanoseconds */ /* all fields are in nanoseconds */
u64 min_duration; u64 min_duration;
u64 max_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 duration_stats_weighted;
struct mean_and_variance_weighted freq_stats_weighted; struct mean_and_variance_weighted freq_stats_weighted;
struct time_stat_buffer __percpu *buffer;
}; };
struct bch2_time_stats_quantiles { struct bch2_time_stats_quantiles {
@ -142,6 +142,7 @@ static inline bool track_event_change(struct bch2_time_stats *stats, bool v)
return false; return false;
} }
void bch2_time_stats_reset(struct bch2_time_stats *);
void bch2_time_stats_exit(struct bch2_time_stats *); void bch2_time_stats_exit(struct bch2_time_stats *);
void bch2_time_stats_init(struct bch2_time_stats *); void bch2_time_stats_init(struct bch2_time_stats *);