|
@@ -1240,6 +1240,11 @@ void bch_initial_mark_key(struct cache_set *c, int level, struct bkey *k)
|
|
|
__bch_btree_mark_key(c, level, k);
|
|
|
}
|
|
|
|
|
|
+void bch_update_bucket_in_use(struct cache_set *c, struct gc_stat *stats)
|
|
|
+{
|
|
|
+ stats->in_use = (c->nbuckets - c->avail_nbuckets) * 100 / c->nbuckets;
|
|
|
+}
|
|
|
+
|
|
|
static bool btree_gc_mark_node(struct btree *b, struct gc_stat *gc)
|
|
|
{
|
|
|
uint8_t stale = 0;
|
|
@@ -1651,9 +1656,8 @@ static void btree_gc_start(struct cache_set *c)
|
|
|
mutex_unlock(&c->bucket_lock);
|
|
|
}
|
|
|
|
|
|
-static size_t bch_btree_gc_finish(struct cache_set *c)
|
|
|
+static void bch_btree_gc_finish(struct cache_set *c)
|
|
|
{
|
|
|
- size_t available = 0;
|
|
|
struct bucket *b;
|
|
|
struct cache *ca;
|
|
|
unsigned i;
|
|
@@ -1690,6 +1694,7 @@ static size_t bch_btree_gc_finish(struct cache_set *c)
|
|
|
}
|
|
|
rcu_read_unlock();
|
|
|
|
|
|
+ c->avail_nbuckets = 0;
|
|
|
for_each_cache(ca, c, i) {
|
|
|
uint64_t *i;
|
|
|
|
|
@@ -1711,18 +1716,16 @@ static size_t bch_btree_gc_finish(struct cache_set *c)
|
|
|
BUG_ON(!GC_MARK(b) && GC_SECTORS_USED(b));
|
|
|
|
|
|
if (!GC_MARK(b) || GC_MARK(b) == GC_MARK_RECLAIMABLE)
|
|
|
- available++;
|
|
|
+ c->avail_nbuckets++;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
mutex_unlock(&c->bucket_lock);
|
|
|
- return available;
|
|
|
}
|
|
|
|
|
|
static void bch_btree_gc(struct cache_set *c)
|
|
|
{
|
|
|
int ret;
|
|
|
- unsigned long available;
|
|
|
struct gc_stat stats;
|
|
|
struct closure writes;
|
|
|
struct btree_op op;
|
|
@@ -1745,14 +1748,14 @@ static void bch_btree_gc(struct cache_set *c)
|
|
|
pr_warn("gc failed!");
|
|
|
} while (ret);
|
|
|
|
|
|
- available = bch_btree_gc_finish(c);
|
|
|
+ bch_btree_gc_finish(c);
|
|
|
wake_up_allocators(c);
|
|
|
|
|
|
bch_time_stats_update(&c->btree_gc_time, start_time);
|
|
|
|
|
|
stats.key_bytes *= sizeof(uint64_t);
|
|
|
stats.data <<= 9;
|
|
|
- stats.in_use = (c->nbuckets - available) * 100 / c->nbuckets;
|
|
|
+ bch_update_bucket_in_use(c, &stats);
|
|
|
memcpy(&c->gc_stats, &stats, sizeof(struct gc_stat));
|
|
|
|
|
|
trace_bcache_gc_end(c);
|