X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libbcachefs%2Fsysfs.c;h=a6d70ce524e91042ca3d426ca99c97f1f50dc1c2;hb=9b08492bc733f3b1b1eefc87a4c52d9673432e42;hp=883165196833ec698ae630aa6362c7bfba5b0308;hpb=a10a41fa2b1a917b0f3b34d20175867f968b2d12;p=bcachefs-tools-debian diff --git a/libbcachefs/sysfs.c b/libbcachefs/sysfs.c index 8831651..a6d70ce 100644 --- a/libbcachefs/sysfs.c +++ b/libbcachefs/sysfs.c @@ -72,9 +72,10 @@ do { \ #define sysfs_hprint(file, val) \ do { \ if (attr == &sysfs_ ## file) { \ - ssize_t ret = bch2_hprint(buf, val); \ - strcat(buf, "\n"); \ - return ret + 1; \ + struct printbuf out = _PBUF(buf, PAGE_SIZE); \ + bch2_hprint(&out, val); \ + pr_buf(&out, "\n"); \ + return out.pos - buf; \ } \ } while (0) @@ -131,6 +132,7 @@ do { \ write_attribute(trigger_journal_flush); write_attribute(trigger_btree_coalesce); write_attribute(trigger_gc); +write_attribute(trigger_alloc_write); write_attribute(prune_cache); rw_attribute(btree_gc_periodic); @@ -232,33 +234,47 @@ static size_t bch2_btree_cache_size(struct bch_fs *c) static ssize_t show_fs_alloc_debug(struct bch_fs *c, char *buf) { struct printbuf out = _PBUF(buf, PAGE_SIZE); - struct bch_fs_usage stats = bch2_fs_usage_read(c); - unsigned replicas, type; - - pr_buf(&out, "capacity:\t\t%llu\n", c->capacity); - - for (replicas = 0; replicas < ARRAY_SIZE(stats.replicas); replicas++) { - pr_buf(&out, "%u replicas:\n", replicas + 1); - - for (type = BCH_DATA_SB; type < BCH_DATA_NR; type++) - pr_buf(&out, "\t%s:\t\t%llu\n", - bch2_data_types[type], - stats.replicas[replicas].data[type]); - pr_buf(&out, "\terasure coded:\t%llu\n", - stats.replicas[replicas].ec_data); - pr_buf(&out, "\treserved:\t%llu\n", - stats.replicas[replicas].persistent_reserved); + struct bch_fs_usage *fs_usage = bch2_fs_usage_read(c); + unsigned i; + + if (!fs_usage) + return -ENOMEM; + + pr_buf(&out, "capacity:\t\t\t%llu\n", c->capacity); + + pr_buf(&out, "hidden:\t\t\t\t%llu\n", + fs_usage->hidden); + pr_buf(&out, "data:\t\t\t\t%llu\n", + fs_usage->data); + pr_buf(&out, "cached:\t\t\t\t%llu\n", + fs_usage->cached); + pr_buf(&out, "reserved:\t\t\t%llu\n", + fs_usage->reserved); + pr_buf(&out, "nr_inodes:\t\t\t%llu\n", + fs_usage->nr_inodes); + pr_buf(&out, "online reserved:\t\t%llu\n", + fs_usage->online_reserved); + + for (i = 0; + i < ARRAY_SIZE(fs_usage->persistent_reserved); + i++) { + pr_buf(&out, "%u replicas:\n", i + 1); + pr_buf(&out, "\treserved:\t\t%llu\n", + fs_usage->persistent_reserved[i]); } - pr_buf(&out, "bucket usage\n"); + for (i = 0; i < c->replicas.nr; i++) { + struct bch_replicas_entry *e = + cpu_replicas_entry(&c->replicas, i); - for (type = BCH_DATA_SB; type < BCH_DATA_NR; type++) - pr_buf(&out, "\t%s:\t\t%llu\n", - bch2_data_types[type], - stats.buckets[type]); + pr_buf(&out, "\t"); + bch2_replicas_entry_to_text(&out, e); + pr_buf(&out, ":\t%llu\n", fs_usage->replicas[i]); + } + + percpu_up_read_preempt_enable(&c->mark_lock); - pr_buf(&out, "online reserved:\t%llu\n", - stats.s.online_reserved); + kfree(fs_usage); return out.pos - buf; } @@ -272,7 +288,7 @@ 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)) + if (!test_bit(BCH_FS_STARTED, &c->flags)) return -EPERM; for_each_btree_key(&iter, c, BTREE_ID_EXTENTS, POS_MIN, 0, k) @@ -465,7 +481,7 @@ STORE(__bch2_fs) BCH_DEBUG_PARAMS() #undef BCH_DEBUG_PARAM - if (!bch2_fs_running(c)) + if (!test_bit(BCH_FS_STARTED, &c->flags)) return -EPERM; /* Debugging: */ @@ -479,6 +495,12 @@ STORE(__bch2_fs) if (attr == &sysfs_trigger_gc) bch2_gc(c, NULL, false); + if (attr == &sysfs_trigger_alloc_write) { + bool wrote; + + bch2_alloc_write(c, false, &wrote); + } + if (attr == &sysfs_prune_cache) { struct shrink_control sc; @@ -571,6 +593,7 @@ struct attribute *bch2_fs_internal_files[] = { &sysfs_trigger_journal_flush, &sysfs_trigger_btree_coalesce, &sysfs_trigger_gc, + &sysfs_trigger_alloc_write, &sysfs_prune_cache, &sysfs_copy_gc_enabled, @@ -657,7 +680,7 @@ int bch2_opts_create_sysfs_files(struct kobject *kobj) for (i = bch2_opt_table; i < bch2_opt_table + bch2_opts_nr; i++) { - if (i->mode == OPT_INTERNAL) + if (!(i->mode & (OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME))) continue; ret = sysfs_create_file(kobj, &i->attr); @@ -795,6 +818,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" @@ -821,7 +850,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, @@ -843,8 +875,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[] = { @@ -856,20 +892,15 @@ static const char * const bch2_rw[] = { static ssize_t show_dev_iodone(struct bch_dev *ca, char *buf) { struct printbuf out = _PBUF(buf, PAGE_SIZE); - int rw, i, cpu; + int rw, i; for (rw = 0; rw < 2; rw++) { pr_buf(&out, "%s:\n", bch2_rw[rw]); - for (i = 1; i < BCH_DATA_NR; i++) { - u64 n = 0; - - for_each_possible_cpu(cpu) - n += per_cpu_ptr(ca->io_done, cpu)->sectors[rw][i]; - + for (i = 1; i < BCH_DATA_NR; i++) pr_buf(&out, "%-12s:%12llu\n", - bch2_data_types[i], n << 9); - } + bch2_data_types[i], + percpu_u64_get(&ca->io_done->sectors[rw][i]) << 9); } return out.pos - buf;