Commit 49a67206 authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet

bcachefs: Add more time stats for being blocked on allocator

Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 7c648fe8
...@@ -246,6 +246,10 @@ struct open_bucket *bch2_bucket_alloc(struct bch_fs *c, struct bch_dev *ca, ...@@ -246,6 +246,10 @@ struct open_bucket *bch2_bucket_alloc(struct bch_fs *c, struct bch_dev *ca,
if (unlikely(c->open_buckets_nr_free <= open_buckets_reserved(reserve))) { if (unlikely(c->open_buckets_nr_free <= open_buckets_reserved(reserve))) {
if (cl) if (cl)
closure_wait(&c->open_buckets_wait, cl); closure_wait(&c->open_buckets_wait, cl);
if (!c->blocked_allocate_open_bucket)
c->blocked_allocate_open_bucket = local_clock();
spin_unlock(&c->freelist_lock); spin_unlock(&c->freelist_lock);
trace_open_bucket_alloc_fail(ca, reserve); trace_open_bucket_alloc_fail(ca, reserve);
return ERR_PTR(-OPEN_BUCKETS_EMPTY); return ERR_PTR(-OPEN_BUCKETS_EMPTY);
...@@ -276,6 +280,9 @@ struct open_bucket *bch2_bucket_alloc(struct bch_fs *c, struct bch_dev *ca, ...@@ -276,6 +280,9 @@ struct open_bucket *bch2_bucket_alloc(struct bch_fs *c, struct bch_dev *ca,
if (cl) if (cl)
closure_wait(&c->freelist_wait, cl); closure_wait(&c->freelist_wait, cl);
if (!c->blocked_allocate)
c->blocked_allocate = local_clock();
spin_unlock(&c->freelist_lock); spin_unlock(&c->freelist_lock);
trace_bucket_alloc_fail(ca, reserve); trace_bucket_alloc_fail(ca, reserve);
...@@ -301,6 +308,20 @@ struct open_bucket *bch2_bucket_alloc(struct bch_fs *c, struct bch_dev *ca, ...@@ -301,6 +308,20 @@ struct open_bucket *bch2_bucket_alloc(struct bch_fs *c, struct bch_dev *ca,
bucket_io_clock_reset(c, ca, bucket, WRITE); bucket_io_clock_reset(c, ca, bucket, WRITE);
spin_unlock(&ob->lock); spin_unlock(&ob->lock);
if (c->blocked_allocate_open_bucket) {
bch2_time_stats_update(
&c->times[BCH_TIME_blocked_allocate_open_bucket],
c->blocked_allocate_open_bucket);
c->blocked_allocate_open_bucket = 0;
}
if (c->blocked_allocate) {
bch2_time_stats_update(
&c->times[BCH_TIME_blocked_allocate],
c->blocked_allocate);
c->blocked_allocate = 0;
}
spin_unlock(&c->freelist_lock); spin_unlock(&c->freelist_lock);
bch2_wake_allocator(ca); bch2_wake_allocator(ca);
......
...@@ -302,8 +302,10 @@ do { \ ...@@ -302,8 +302,10 @@ do { \
x(data_promote) \ x(data_promote) \
x(journal_write) \ x(journal_write) \
x(journal_delay) \ x(journal_delay) \
x(journal_blocked) \ x(journal_flush_seq) \
x(journal_flush_seq) x(blocked_journal) \
x(blocked_allocate) \
x(blocked_allocate_open_bucket)
enum bch_time_stats { enum bch_time_stats {
#define x(name) BCH_TIME_##name, #define x(name) BCH_TIME_##name,
...@@ -653,6 +655,8 @@ struct bch_fs { ...@@ -653,6 +655,8 @@ struct bch_fs {
/* ALLOCATOR */ /* ALLOCATOR */
spinlock_t freelist_lock; spinlock_t freelist_lock;
struct closure_waitlist freelist_wait; struct closure_waitlist freelist_wait;
u64 blocked_allocate;
u64 blocked_allocate_open_bucket;
u8 open_buckets_freelist; u8 open_buckets_freelist;
u8 open_buckets_nr_free; u8 open_buckets_nr_free;
struct closure_waitlist open_buckets_wait; struct closure_waitlist open_buckets_wait;
......
...@@ -596,7 +596,7 @@ static struct bch_fs *bch2_fs_alloc(struct bch_sb *sb, struct bch_opts opts) ...@@ -596,7 +596,7 @@ static struct bch_fs *bch2_fs_alloc(struct bch_sb *sb, struct bch_opts opts)
c->journal.write_time = &c->times[BCH_TIME_journal_write]; c->journal.write_time = &c->times[BCH_TIME_journal_write];
c->journal.delay_time = &c->times[BCH_TIME_journal_delay]; c->journal.delay_time = &c->times[BCH_TIME_journal_delay];
c->journal.blocked_time = &c->times[BCH_TIME_journal_blocked]; c->journal.blocked_time = &c->times[BCH_TIME_blocked_journal];
c->journal.flush_seq_time = &c->times[BCH_TIME_journal_flush_seq]; c->journal.flush_seq_time = &c->times[BCH_TIME_journal_flush_seq];
bch2_fs_btree_cache_init_early(&c->btree_cache); bch2_fs_btree_cache_init_early(&c->btree_cache);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment