summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-03-18 13:42:10 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2019-03-18 13:42:10 -0400
commita5ccfdfd45ca544b8cdaf91aa5052efb70af4ac9 (patch)
tree9c3bb24b704a5d5b659675f6fbcfdb2ded48075d
parent12809e2e6dcef2a6520fdab0460ff675043f8360 (diff)
bcachefs: Add more time stats for being blocked on allocator
-rw-r--r--fs/bcachefs/alloc_foreground.c21
-rw-r--r--fs/bcachefs/bcachefs.h8
-rw-r--r--fs/bcachefs/super.c2
3 files changed, 28 insertions, 3 deletions
diff --git a/fs/bcachefs/alloc_foreground.c b/fs/bcachefs/alloc_foreground.c
index 6568e8ac2003..7fb1e5a4ca69 100644
--- a/fs/bcachefs/alloc_foreground.c
+++ b/fs/bcachefs/alloc_foreground.c
@@ -245,6 +245,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 (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);
trace_open_bucket_alloc_fail(ca, reserve);
return ERR_PTR(-OPEN_BUCKETS_EMPTY);
@@ -275,6 +279,9 @@ struct open_bucket *bch2_bucket_alloc(struct bch_fs *c, struct bch_dev *ca,
if (cl)
closure_wait(&c->freelist_wait, cl);
+ if (!c->blocked_allocate)
+ c->blocked_allocate = local_clock();
+
spin_unlock(&c->freelist_lock);
trace_bucket_alloc_fail(ca, reserve);
@@ -300,6 +307,20 @@ out:
bucket_io_clock_reset(c, ca, bucket, WRITE);
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);
bch2_wake_allocator(ca);
diff --git a/fs/bcachefs/bcachefs.h b/fs/bcachefs/bcachefs.h
index b742d72167c6..028b4b8249bb 100644
--- a/fs/bcachefs/bcachefs.h
+++ b/fs/bcachefs/bcachefs.h
@@ -299,8 +299,10 @@ do { \
x(data_promote) \
x(journal_write) \
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 {
#define x(name) BCH_TIME_##name,
@@ -650,6 +652,8 @@ struct bch_fs {
/* ALLOCATOR */
spinlock_t freelist_lock;
struct closure_waitlist freelist_wait;
+ u64 blocked_allocate;
+ u64 blocked_allocate_open_bucket;
u8 open_buckets_freelist;
u8 open_buckets_nr_free;
struct closure_waitlist open_buckets_wait;
diff --git a/fs/bcachefs/super.c b/fs/bcachefs/super.c
index bbf5b9725407..f08a1e871c4f 100644
--- a/fs/bcachefs/super.c
+++ b/fs/bcachefs/super.c
@@ -628,7 +628,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.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];
bch2_fs_btree_cache_init_early(&c->btree_cache);