summaryrefslogtreecommitdiff
path: root/libbcachefs/sysfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbcachefs/sysfs.c')
-rw-r--r--libbcachefs/sysfs.c249
1 files changed, 65 insertions, 184 deletions
diff --git a/libbcachefs/sysfs.c b/libbcachefs/sysfs.c
index 808b3089..ba04bbad 100644
--- a/libbcachefs/sysfs.c
+++ b/libbcachefs/sysfs.c
@@ -120,6 +120,7 @@ do { \
return strtoi_h(buf, &var) ?: (ssize_t) size; \
} while (0)
+write_attribute(trigger_journal_flush);
write_attribute(trigger_btree_coalesce);
write_attribute(trigger_gc);
write_attribute(prune_cache);
@@ -127,35 +128,25 @@ write_attribute(prune_cache);
read_attribute(uuid);
read_attribute(minor);
read_attribute(bucket_size);
-read_attribute(bucket_size_bytes);
read_attribute(block_size);
-read_attribute(block_size_bytes);
read_attribute(btree_node_size);
-read_attribute(btree_node_size_bytes);
read_attribute(first_bucket);
read_attribute(nbuckets);
-read_attribute(tree_depth);
-read_attribute(root_usage_percent);
read_attribute(read_priority_stats);
read_attribute(write_priority_stats);
read_attribute(fragmentation_stats);
read_attribute(oldest_gen_stats);
read_attribute(reserve_stats);
read_attribute(btree_cache_size);
-read_attribute(cache_available_percent);
read_attribute(compression_stats);
read_attribute(written);
read_attribute(btree_written);
read_attribute(metadata_written);
read_attribute(journal_debug);
-write_attribute(journal_flush);
-read_attribute(internal_uuid);
+read_attribute(journal_pins);
-read_attribute(btree_gc_running);
+read_attribute(internal_uuid);
-read_attribute(btree_nodes);
-read_attribute(btree_used_percent);
-read_attribute(average_key_size);
read_attribute(available_buckets);
read_attribute(free_buckets);
read_attribute(dirty_data);
@@ -168,10 +159,9 @@ read_attribute(meta_buckets);
read_attribute(alloc_buckets);
read_attribute(has_data);
read_attribute(has_metadata);
-read_attribute(bset_tree_stats);
read_attribute(alloc_debug);
-read_attribute(cache_read_races);
+read_attribute(read_realloc_races);
rw_attribute(journal_write_delay_ms);
rw_attribute(journal_reclaim_delay_ms);
@@ -221,73 +211,6 @@ static struct attribute sysfs_state_rw = {
.mode = S_IRUGO
};
-static int bch2_bset_print_stats(struct bch_fs *c, char *buf)
-{
- struct bset_stats stats;
- size_t nodes = 0;
- struct btree *b;
- struct bucket_table *tbl;
- struct rhash_head *pos;
- unsigned iter;
-
- memset(&stats, 0, sizeof(stats));
-
- rcu_read_lock();
- for_each_cached_btree(b, c, tbl, iter, pos) {
- bch2_btree_keys_stats(b, &stats);
- nodes++;
- }
- rcu_read_unlock();
-
- return snprintf(buf, PAGE_SIZE,
- "btree nodes: %zu\n"
- "written sets: %zu\n"
- "written key bytes: %zu\n"
- "unwritten sets: %zu\n"
- "unwritten key bytes: %zu\n"
- "no table sets: %zu\n"
- "no table key bytes: %zu\n"
- "floats: %zu\n"
- "failed unpacked: %zu\n"
- "failed prev: %zu\n"
- "failed overflow: %zu\n",
- nodes,
- stats.sets[BSET_RO_AUX_TREE].nr,
- stats.sets[BSET_RO_AUX_TREE].bytes,
- stats.sets[BSET_RW_AUX_TREE].nr,
- stats.sets[BSET_RW_AUX_TREE].bytes,
- stats.sets[BSET_NO_AUX_TREE].nr,
- stats.sets[BSET_NO_AUX_TREE].bytes,
- stats.floats,
- stats.failed_unpacked,
- stats.failed_prev,
- stats.failed_overflow);
-}
-
-static unsigned bch2_root_usage(struct bch_fs *c)
-{
- unsigned bytes = 0;
- struct bkey_packed *k;
- struct btree *b;
- struct btree_node_iter iter;
-
- goto lock_root;
-
- do {
- six_unlock_read(&b->lock);
-lock_root:
- b = c->btree_roots[BTREE_ID_EXTENTS].b;
- six_lock_read(&b->lock);
- } while (b != c->btree_roots[BTREE_ID_EXTENTS].b);
-
- for_each_btree_node_key(b, k, &iter, btree_node_is_extents(b))
- bytes += bkey_bytes(k);
-
- six_unlock_read(&b->lock);
-
- return (bytes * 100) / btree_bytes(c);
-}
-
static size_t bch2_btree_cache_size(struct bch_fs *c)
{
size_t ret = 0;
@@ -301,27 +224,6 @@ static size_t bch2_btree_cache_size(struct bch_fs *c)
return ret;
}
-static unsigned bch2_fs_available_percent(struct bch_fs *c)
-{
- return div64_u64((u64) sectors_available(c) * 100,
- c->capacity ?: 1);
-}
-
-#if 0
-static unsigned bch2_btree_used(struct bch_fs *c)
-{
- return div64_u64(c->gc_stats.key_bytes * 100,
- (c->gc_stats.nodes ?: 1) * btree_bytes(c));
-}
-
-static unsigned bch2_average_key_size(struct bch_fs *c)
-{
- return c->gc_stats.nkeys
- ? div64_u64(c->gc_stats.data, c->gc_stats.nkeys)
- : 0;
-}
-#endif
-
static ssize_t show_fs_alloc_debug(struct bch_fs *c, char *buf)
{
struct bch_fs_usage stats = bch2_fs_usage_read(c);
@@ -358,6 +260,9 @@ static ssize_t bch2_compression_stats(struct bch_fs *c, char *buf)
compressed_sectors_compressed = 0,
compressed_sectors_uncompressed = 0;
+ if (!bch2_fs_running(c))
+ return -EPERM;
+
for_each_btree_key(&iter, c, BTREE_ID_EXTENTS, POS_MIN, k)
if (k.k->type == BCH_EXTENT) {
struct bkey_s_c_extent e = bkey_s_c_to_extent(k);
@@ -402,29 +307,17 @@ SHOW(bch2_fs)
struct bch_fs *c = container_of(kobj, struct bch_fs, kobj);
sysfs_print(minor, c->minor);
+ sysfs_printf(internal_uuid, "%pU", c->sb.uuid.b);
sysfs_print(journal_write_delay_ms, c->journal.write_delay_ms);
sysfs_print(journal_reclaim_delay_ms, c->journal.reclaim_delay_ms);
- sysfs_hprint(block_size, block_bytes(c));
- sysfs_print(block_size_bytes, block_bytes(c));
- sysfs_hprint(btree_node_size, c->sb.btree_node_size << 9);
- sysfs_print(btree_node_size_bytes, c->sb.btree_node_size << 9);
-
+ sysfs_print(block_size, block_bytes(c));
+ sysfs_print(btree_node_size, btree_bytes(c));
sysfs_hprint(btree_cache_size, bch2_btree_cache_size(c));
- sysfs_print(cache_available_percent, bch2_fs_available_percent(c));
- sysfs_print(btree_gc_running, c->gc_pos.phase != GC_PHASE_DONE);
-
-#if 0
- /* XXX: reimplement */
- sysfs_print(btree_used_percent, bch2_btree_used(c));
- sysfs_print(btree_nodes, c->gc_stats.nodes);
- sysfs_hprint(average_key_size, bch2_average_key_size(c));
-#endif
-
- sysfs_print(cache_read_races,
- atomic_long_read(&c->cache_read_races));
+ sysfs_print(read_realloc_races,
+ atomic_long_read(&c->read_realloc_races));
sysfs_printf(foreground_write_ratelimit_enabled, "%i",
c->foreground_write_ratelimit_enabled);
@@ -445,28 +338,21 @@ SHOW(bch2_fs)
/* Debugging: */
- if (attr == &sysfs_journal_debug)
- return bch2_journal_print_debug(&c->journal, buf);
-
-#define BCH_DEBUG_PARAM(name, description) sysfs_print(name, c->name);
- BCH_DEBUG_PARAMS()
-#undef BCH_DEBUG_PARAM
-
- if (!bch2_fs_running(c))
- return -EPERM;
-
- if (attr == &sysfs_bset_tree_stats)
- return bch2_bset_print_stats(c, buf);
if (attr == &sysfs_alloc_debug)
return show_fs_alloc_debug(c, buf);
- sysfs_print(tree_depth, c->btree_roots[BTREE_ID_EXTENTS].b->level);
- sysfs_print(root_usage_percent, bch2_root_usage(c));
+ if (attr == &sysfs_journal_debug)
+ return bch2_journal_print_debug(&c->journal, buf);
+
+ if (attr == &sysfs_journal_pins)
+ return bch2_journal_print_pins(&c->journal, buf);
if (attr == &sysfs_compression_stats)
return bch2_compression_stats(c, buf);
- sysfs_printf(internal_uuid, "%pU", c->sb.uuid.b);
+#define BCH_DEBUG_PARAM(name, description) sysfs_print(name, c->name);
+ BCH_DEBUG_PARAMS()
+#undef BCH_DEBUG_PARAM
return 0;
}
@@ -519,17 +405,14 @@ STORE(__bch2_fs)
if (!bch2_fs_running(c))
return -EPERM;
- if (attr == &sysfs_journal_flush) {
- bch2_journal_meta_async(&c->journal, NULL);
+ /* Debugging: */
- return size;
- }
+ if (attr == &sysfs_trigger_journal_flush)
+ bch2_journal_meta_async(&c->journal, NULL);
if (attr == &sysfs_trigger_btree_coalesce)
bch2_coalesce(c);
- /* Debugging: */
-
if (attr == &sysfs_trigger_gc)
bch2_gc(c);
@@ -557,28 +440,21 @@ STORE(bch2_fs)
SYSFS_OPS(bch2_fs);
struct attribute *bch2_fs_files[] = {
- &sysfs_journal_write_delay_ms,
- &sysfs_journal_reclaim_delay_ms,
-
+ &sysfs_minor,
&sysfs_block_size,
- &sysfs_block_size_bytes,
&sysfs_btree_node_size,
- &sysfs_btree_node_size_bytes,
- &sysfs_tree_depth,
- &sysfs_root_usage_percent,
&sysfs_btree_cache_size,
- &sysfs_cache_available_percent,
- &sysfs_compression_stats,
-
- &sysfs_average_key_size,
&sysfs_meta_replicas_have,
&sysfs_data_replicas_have,
+ &sysfs_journal_write_delay_ms,
+ &sysfs_journal_reclaim_delay_ms,
+
&sysfs_foreground_target_percent,
&sysfs_tiering_percent,
- &sysfs_journal_flush,
+ &sysfs_compression_stats,
NULL
};
@@ -598,21 +474,17 @@ STORE(bch2_fs_internal)
SYSFS_OPS(bch2_fs_internal);
struct attribute *bch2_fs_internal_files[] = {
- &sysfs_journal_debug,
-
&sysfs_alloc_debug,
+ &sysfs_journal_debug,
+ &sysfs_journal_pins,
- &sysfs_btree_gc_running,
-
- &sysfs_btree_nodes,
- &sysfs_btree_used_percent,
-
- &sysfs_bset_tree_stats,
- &sysfs_cache_read_races,
+ &sysfs_read_realloc_races,
+ &sysfs_trigger_journal_flush,
&sysfs_trigger_btree_coalesce,
&sysfs_trigger_gc,
&sysfs_prune_cache,
+
&sysfs_foreground_write_ratelimit_enabled,
&sysfs_copy_gc_enabled,
&sysfs_tiering_enabled,
@@ -853,10 +725,8 @@ SHOW(bch2_dev)
sysfs_printf(uuid, "%pU\n", ca->uuid.b);
- sysfs_hprint(bucket_size, bucket_bytes(ca));
- sysfs_print(bucket_size_bytes, bucket_bytes(ca));
- sysfs_hprint(block_size, block_bytes(c));
- sysfs_print(block_size_bytes, block_bytes(c));
+ sysfs_print(bucket_size, bucket_bytes(ca));
+ sysfs_print(block_size, block_bytes(c));
sysfs_print(first_bucket, ca->mi.first_bucket);
sysfs_print(nbuckets, ca->mi.nbuckets);
sysfs_print(discard, ca->mi.discard);
@@ -979,35 +849,46 @@ SYSFS_OPS(bch2_dev);
struct attribute *bch2_dev_files[] = {
&sysfs_uuid,
&sysfs_bucket_size,
- &sysfs_bucket_size_bytes,
&sysfs_block_size,
- &sysfs_block_size_bytes,
&sysfs_first_bucket,
&sysfs_nbuckets,
- &sysfs_read_priority_stats,
- &sysfs_write_priority_stats,
- &sysfs_fragmentation_stats,
- &sysfs_oldest_gen_stats,
- &sysfs_reserve_stats,
- &sysfs_available_buckets,
- &sysfs_free_buckets,
+
+ /* settings: */
+ &sysfs_discard,
+ &sysfs_cache_replacement_policy,
+ &sysfs_tier,
+ &sysfs_state_rw,
+
+ &sysfs_has_data,
+ &sysfs_has_metadata,
+
+ /* io stats: */
+ &sysfs_written,
+ &sysfs_btree_written,
+ &sysfs_metadata_written,
+
+ /* alloc info - data: */
&sysfs_dirty_data,
&sysfs_dirty_bytes,
- &sysfs_dirty_buckets,
&sysfs_cached_data,
&sysfs_cached_bytes,
+
+ /* alloc info - buckets: */
+ &sysfs_available_buckets,
+ &sysfs_free_buckets,
+ &sysfs_dirty_buckets,
&sysfs_cached_buckets,
&sysfs_meta_buckets,
&sysfs_alloc_buckets,
- &sysfs_has_data,
- &sysfs_has_metadata,
- &sysfs_discard,
- &sysfs_written,
- &sysfs_btree_written,
- &sysfs_metadata_written,
- &sysfs_cache_replacement_policy,
- &sysfs_tier,
- &sysfs_state_rw,
+
+ /* alloc info - other stats: */
+ &sysfs_read_priority_stats,
+ &sysfs_write_priority_stats,
+ &sysfs_fragmentation_stats,
+ &sysfs_oldest_gen_stats,
+ &sysfs_reserve_stats,
+
+ /* debug: */
&sysfs_alloc_debug,
sysfs_pd_controller_files(copy_gc),