summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-01-19 13:13:29 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2019-04-03 12:44:03 -0400
commite103a69883c515f1ae6aed126a578c5bb2ed6841 (patch)
treec85e701e3edbf0d0e646ac3b040d04a699c5167e
parente4fca82fca5c831fb38d1ff10c52b6e92c11ed74 (diff)
bcachefs: Fix some reserve calculations
-rw-r--r--fs/bcachefs/alloc_foreground.c6
-rw-r--r--fs/bcachefs/alloc_foreground.h1
-rw-r--r--fs/bcachefs/alloc_types.h5
-rw-r--r--fs/bcachefs/bcachefs.h2
-rw-r--r--fs/bcachefs/sysfs.c19
5 files changed, 26 insertions, 7 deletions
diff --git a/fs/bcachefs/alloc_foreground.c b/fs/bcachefs/alloc_foreground.c
index 4041972236bb..f2f9015dbb00 100644
--- a/fs/bcachefs/alloc_foreground.c
+++ b/fs/bcachefs/alloc_foreground.c
@@ -106,6 +106,7 @@ void __bch2_open_bucket_put(struct bch_fs *c, struct open_bucket *ob)
bch2_mark_alloc_bucket(c, ca, PTR_BUCKET_NR(ca, &ob->ptr),
false, gc_pos_alloc(c, ob), 0);
ob->valid = false;
+ ob->type = 0;
spin_unlock(&ob->lock);
percpu_up_read_preempt_enable(&c->mark_lock);
@@ -141,6 +142,7 @@ static struct open_bucket *bch2_open_bucket_alloc(struct bch_fs *c)
ob = c->open_buckets + c->open_buckets_freelist;
c->open_buckets_freelist = ob->freelist;
atomic_set(&ob->pin, 1);
+ ob->type = 0;
c->open_buckets_nr_free--;
return ob;
@@ -209,9 +211,9 @@ static inline unsigned open_buckets_reserved(enum alloc_reserve reserve)
case RESERVE_ALLOC:
return 0;
case RESERVE_BTREE:
- return BTREE_NODE_RESERVE / 2;
+ return BTREE_NODE_OPEN_BUCKET_RESERVE;
default:
- return BTREE_NODE_RESERVE;
+ return BTREE_NODE_OPEN_BUCKET_RESERVE * 2;
}
}
diff --git a/fs/bcachefs/alloc_foreground.h b/fs/bcachefs/alloc_foreground.h
index b0e44f758d7f..5224a52f8beb 100644
--- a/fs/bcachefs/alloc_foreground.h
+++ b/fs/bcachefs/alloc_foreground.h
@@ -85,6 +85,7 @@ static inline void bch2_open_bucket_get(struct bch_fs *c,
unsigned i;
open_bucket_for_each(c, &wp->ptrs, ob, i) {
+ ob->type = wp->type;
atomic_inc(&ob->pin);
ob_push(c, ptrs, ob);
}
diff --git a/fs/bcachefs/alloc_types.h b/fs/bcachefs/alloc_types.h
index 6f17f094c21e..66457fc722fd 100644
--- a/fs/bcachefs/alloc_types.h
+++ b/fs/bcachefs/alloc_types.h
@@ -55,9 +55,10 @@ struct open_bucket {
spinlock_t lock;
atomic_t pin;
u8 freelist;
- bool valid;
- bool on_partial_list;
u8 ec_idx;
+ u8 type;
+ unsigned valid:1;
+ unsigned on_partial_list:1;
unsigned sectors_free;
struct bch_extent_ptr ptr;
struct ec_stripe_new *ec;
diff --git a/fs/bcachefs/bcachefs.h b/fs/bcachefs/bcachefs.h
index 8faddf4eaa02..a279e96472b1 100644
--- a/fs/bcachefs/bcachefs.h
+++ b/fs/bcachefs/bcachefs.h
@@ -330,6 +330,8 @@ enum bch_time_stats {
/* Size of the freelist we allocate btree nodes from: */
#define BTREE_NODE_RESERVE BTREE_RESERVE_MAX
+#define BTREE_NODE_OPEN_BUCKET_RESERVE (BTREE_RESERVE_MAX * BCH_REPLICAS_MAX)
+
struct btree;
enum gc_phase {
diff --git a/fs/bcachefs/sysfs.c b/fs/bcachefs/sysfs.c
index 316f827fa490..3a25163e2de0 100644
--- a/fs/bcachefs/sysfs.c
+++ b/fs/bcachefs/sysfs.c
@@ -796,6 +796,12 @@ static ssize_t show_dev_alloc_debug(struct bch_dev *ca, char *buf)
{
struct bch_fs *c = ca->fs;
struct bch_dev_usage stats = bch2_dev_usage_read(c, ca);
+ unsigned i, nr[BCH_DATA_NR];
+
+ memset(nr, 0, sizeof(nr));
+
+ for (i = 0; i < ARRAY_SIZE(c->open_buckets); i++)
+ nr[c->open_buckets[i].type]++;
return scnprintf(buf, PAGE_SIZE,
"free_inc: %zu/%zu\n"
@@ -822,7 +828,10 @@ static ssize_t show_dev_alloc_debug(struct bch_dev *ca, char *buf)
" copygc threshold: %llu\n"
"freelist_wait: %s\n"
"open buckets: %u/%u (reserved %u)\n"
- "open_buckets_wait: %s\n",
+ "open_buckets_wait: %s\n"
+ "open_buckets_btree: %u\n"
+ "open_buckets_user: %u\n"
+ "btree reserve cache: %u\n",
fifo_used(&ca->free_inc), ca->free_inc.size,
fifo_used(&ca->free[RESERVE_BTREE]), ca->free[RESERVE_BTREE].size,
fifo_used(&ca->free[RESERVE_MOVINGGC]), ca->free[RESERVE_MOVINGGC].size,
@@ -844,8 +853,12 @@ static ssize_t show_dev_alloc_debug(struct bch_dev *ca, char *buf)
stats.sectors_fragmented,
ca->copygc_threshold,
c->freelist_wait.list.first ? "waiting" : "empty",
- c->open_buckets_nr_free, OPEN_BUCKETS_COUNT, BTREE_NODE_RESERVE,
- c->open_buckets_wait.list.first ? "waiting" : "empty");
+ c->open_buckets_nr_free, OPEN_BUCKETS_COUNT,
+ BTREE_NODE_OPEN_BUCKET_RESERVE,
+ c->open_buckets_wait.list.first ? "waiting" : "empty",
+ nr[BCH_DATA_BTREE],
+ nr[BCH_DATA_USER],
+ c->btree_reserve_cache_nr);
}
static const char * const bch2_rw[] = {