]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/sysfs.c
Update bcachefs sources to e82e656279 bcachefs: Cleanups for building in userspace
[bcachefs-tools-debian] / libbcachefs / sysfs.c
index 3c47f1cb2ee763b7b88a22019239f46891d3c64c..ff3deba8dac249440f9ffb03b75868a4d57835e6 100644 (file)
@@ -5,6 +5,8 @@
  * Copyright 2012 Google, Inc.
  */
 
+#ifndef NO_BCACHEFS_SYSFS
+
 #include "bcachefs.h"
 #include "alloc.h"
 #include "compress.h"
@@ -24,6 +26,7 @@
 
 #include <linux/blkdev.h>
 #include <linux/sort.h>
+#include <linux/sched/clock.h>
 
 #include "util.h"
 
@@ -52,7 +55,7 @@ static ssize_t fn ## _store(struct kobject *kobj, struct attribute *attr,\
 #define sysfs_printf(file, fmt, ...)                                   \
 do {                                                                   \
        if (attr == &sysfs_ ## file)                                    \
-               return snprintf(buf, PAGE_SIZE, fmt "\n", __VA_ARGS__); \
+               return scnprintf(buf, PAGE_SIZE, fmt "\n", __VA_ARGS__);\
 } while (0)
 
 #define sysfs_print(file, var)                                         \
@@ -124,6 +127,7 @@ write_attribute(trigger_journal_flush);
 write_attribute(trigger_btree_coalesce);
 write_attribute(trigger_gc);
 write_attribute(prune_cache);
+rw_attribute(btree_gc_periodic);
 
 read_attribute(uuid);
 read_attribute(minor);
@@ -132,6 +136,7 @@ read_attribute(block_size);
 read_attribute(btree_node_size);
 read_attribute(first_bucket);
 read_attribute(nbuckets);
+read_attribute(iostats);
 read_attribute(read_priority_stats);
 read_attribute(write_priority_stats);
 read_attribute(fragmentation_stats);
@@ -139,9 +144,6 @@ read_attribute(oldest_gen_stats);
 read_attribute(reserve_stats);
 read_attribute(btree_cache_size);
 read_attribute(compression_stats);
-read_attribute(written);
-read_attribute(btree_written);
-read_attribute(metadata_written);
 read_attribute(journal_debug);
 read_attribute(journal_pins);
 
@@ -158,7 +160,6 @@ read_attribute(cached_buckets);
 read_attribute(meta_buckets);
 read_attribute(alloc_buckets);
 read_attribute(has_data);
-read_attribute(has_metadata);
 read_attribute(alloc_debug);
 
 read_attribute(read_realloc_races);
@@ -230,24 +231,36 @@ static ssize_t show_fs_alloc_debug(struct bch_fs *c, char *buf)
 
        return scnprintf(buf, PAGE_SIZE,
                         "capacity:\t\t%llu\n"
-                        "compressed:\n"
+                        "1 replicas:\n"
+                        "\tmeta:\t\t%llu\n"
+                        "\tdirty:\t\t%llu\n"
+                        "\treserved:\t%llu\n"
+                        "2 replicas:\n"
+                        "\tmeta:\t\t%llu\n"
+                        "\tdirty:\t\t%llu\n"
+                        "\treserved:\t%llu\n"
+                        "3 replicas:\n"
                         "\tmeta:\t\t%llu\n"
                         "\tdirty:\t\t%llu\n"
-                        "\tcached:\t\t%llu\n"
-                        "uncompressed:\n"
+                        "\treserved:\t%llu\n"
+                        "4 replicas:\n"
                         "\tmeta:\t\t%llu\n"
                         "\tdirty:\t\t%llu\n"
-                        "\tcached:\t\t%llu\n"
-                        "persistent reserved sectors:\t%llu\n"
-                        "online reserved sectors:\t%llu\n",
+                        "\treserved:\t%llu\n"
+                        "online reserved:\t%llu\n",
                         c->capacity,
-                        stats.s[S_COMPRESSED][S_META],
-                        stats.s[S_COMPRESSED][S_DIRTY],
-                        stats.s[S_COMPRESSED][S_CACHED],
-                        stats.s[S_UNCOMPRESSED][S_META],
-                        stats.s[S_UNCOMPRESSED][S_DIRTY],
-                        stats.s[S_UNCOMPRESSED][S_CACHED],
-                        stats.persistent_reserved,
+                        stats.s[0].data[S_META],
+                        stats.s[0].data[S_DIRTY],
+                        stats.s[0].persistent_reserved,
+                        stats.s[1].data[S_META],
+                        stats.s[1].data[S_DIRTY],
+                        stats.s[1].persistent_reserved,
+                        stats.s[2].data[S_META],
+                        stats.s[2].data[S_DIRTY],
+                        stats.s[2].persistent_reserved,
+                        stats.s[3].data[S_META],
+                        stats.s[3].data[S_DIRTY],
+                        stats.s[3].persistent_reserved,
                         stats.online_reserved);
 }
 
@@ -287,7 +300,7 @@ static ssize_t bch2_compression_stats(struct bch_fs *c, char *buf)
                }
        bch2_btree_iter_unlock(&iter);
 
-       return snprintf(buf, PAGE_SIZE,
+       return scnprintf(buf, PAGE_SIZE,
                        "uncompressed data:\n"
                        "       nr extents:                     %llu\n"
                        "       size (bytes):                   %llu\n"
@@ -319,6 +332,8 @@ SHOW(bch2_fs)
        sysfs_print(read_realloc_races,
                    atomic_long_read(&c->read_realloc_races));
 
+       sysfs_printf(btree_gc_periodic, "%u",   (int) c->btree_gc_periodic);
+
        sysfs_printf(foreground_write_ratelimit_enabled, "%i",
                     c->foreground_write_ratelimit_enabled);
        sysfs_printf(copy_gc_enabled, "%i", c->copy_gc_enabled);
@@ -333,8 +348,8 @@ SHOW(bch2_fs)
 
        sysfs_pd_controller_show(tiering,       &c->tiers[1].pd); /* XXX */
 
-       sysfs_printf(meta_replicas_have, "%u",  c->sb.meta_replicas_have);
-       sysfs_printf(data_replicas_have, "%u",  c->sb.data_replicas_have);
+       sysfs_printf(meta_replicas_have, "%u",  bch2_replicas_online(c, true));
+       sysfs_printf(data_replicas_have, "%u",  bch2_replicas_online(c, false));
 
        /* Debugging: */
 
@@ -367,6 +382,14 @@ STORE(__bch2_fs)
        sysfs_strtoul(foreground_write_ratelimit_enabled,
                      c->foreground_write_ratelimit_enabled);
 
+       if (attr == &sysfs_btree_gc_periodic) {
+               ssize_t ret = strtoul_safe(buf, c->btree_gc_periodic)
+                       ?: (ssize_t) size;
+
+               wake_up_process(c->gc_thread);
+               return ret;
+       }
+
        if (attr == &sysfs_copy_gc_enabled) {
                struct bch_dev *ca;
                unsigned i;
@@ -503,9 +526,13 @@ struct attribute *bch2_fs_internal_files[] = {
 
 SHOW(bch2_fs_opts_dir)
 {
+       char *out = buf, *end = buf + PAGE_SIZE;
        struct bch_fs *c = container_of(kobj, struct bch_fs, opts_dir);
 
-       return bch2_opt_show(&c->opts, attr->name, buf, PAGE_SIZE);
+       out += bch2_opt_show(&c->opts, attr->name, out, end - out);
+       out += scnprintf(out, end - out, "\n");
+
+       return out - buf;
 }
 
 STORE(bch2_fs_opts_dir)
@@ -681,7 +708,6 @@ static ssize_t show_dev_alloc_debug(struct bch_dev *ca, char *buf)
 
        return scnprintf(buf, PAGE_SIZE,
                "free_inc:               %zu/%zu\n"
-               "free[RESERVE_PRIO]:     %zu/%zu\n"
                "free[RESERVE_BTREE]:    %zu/%zu\n"
                "free[RESERVE_MOVINGGC]: %zu/%zu\n"
                "free[RESERVE_NONE]:     %zu/%zu\n"
@@ -693,28 +719,44 @@ static ssize_t show_dev_alloc_debug(struct bch_dev *ca, char *buf)
                "open buckets:           %u/%u (reserved %u)\n"
                "open_buckets_wait:      %s\n",
                fifo_used(&ca->free_inc),               ca->free_inc.size,
-               fifo_used(&ca->free[RESERVE_PRIO]),     ca->free[RESERVE_PRIO].size,
                fifo_used(&ca->free[RESERVE_BTREE]),    ca->free[RESERVE_BTREE].size,
                fifo_used(&ca->free[RESERVE_MOVINGGC]), ca->free[RESERVE_MOVINGGC].size,
                fifo_used(&ca->free[RESERVE_NONE]),     ca->free[RESERVE_NONE].size,
                stats.buckets_alloc,                    ca->mi.nbuckets - ca->mi.first_bucket,
-               stats.buckets_meta,                     ca->mi.nbuckets - ca->mi.first_bucket,
-               stats.buckets_dirty,                    ca->mi.nbuckets - ca->mi.first_bucket,
+               stats.buckets[S_META],                  ca->mi.nbuckets - ca->mi.first_bucket,
+               stats.buckets[S_DIRTY],                 ca->mi.nbuckets - ca->mi.first_bucket,
                __dev_buckets_available(ca, stats),     ca->mi.nbuckets - ca->mi.first_bucket,
                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");
 }
 
-static u64 sectors_written(struct bch_dev *ca)
+const char * const bch2_rw[] = {
+       "read",
+       "write",
+       NULL
+};
+
+static ssize_t show_dev_iostats(struct bch_dev *ca, char *buf)
 {
-       u64 ret = 0;
-       int cpu;
+       char *out = buf, *end = buf + PAGE_SIZE;
+       int rw, i, cpu;
 
-       for_each_possible_cpu(cpu)
-               ret += *per_cpu_ptr(ca->sectors_written, cpu);
+       for (rw = 0; rw < 2; rw++) {
+               out += scnprintf(out, end - out, "%s:\n", bch2_rw[rw]);
 
-       return ret;
+               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];
+
+                       out += scnprintf(out, end - out, "%-12s:%12llu\n",
+                                        bch2_data_types[i], n << 9);
+               }
+       }
+
+       return out - buf;
 }
 
 SHOW(bch2_dev)
@@ -722,6 +764,7 @@ SHOW(bch2_dev)
        struct bch_dev *ca = container_of(kobj, struct bch_dev, kobj);
        struct bch_fs *c = ca->fs;
        struct bch_dev_usage stats = bch2_dev_usage_read(ca);
+       char *out = buf, *end = buf + PAGE_SIZE;
 
        sysfs_printf(uuid,              "%pU\n", ca->uuid.b);
 
@@ -730,40 +773,48 @@ SHOW(bch2_dev)
        sysfs_print(first_bucket,       ca->mi.first_bucket);
        sysfs_print(nbuckets,           ca->mi.nbuckets);
        sysfs_print(discard,            ca->mi.discard);
-       sysfs_hprint(written, sectors_written(ca) << 9);
-       sysfs_hprint(btree_written,
-                    atomic64_read(&ca->btree_sectors_written) << 9);
-       sysfs_hprint(metadata_written,
-                    (atomic64_read(&ca->meta_sectors_written) +
-                     atomic64_read(&ca->btree_sectors_written)) << 9);
 
        sysfs_hprint(dirty_data,        stats.sectors[S_DIRTY] << 9);
        sysfs_print(dirty_bytes,        stats.sectors[S_DIRTY] << 9);
-       sysfs_print(dirty_buckets,      stats.buckets_dirty);
-       sysfs_hprint(cached_data,       stats.sectors[S_CACHED] << 9);
-       sysfs_print(cached_bytes,       stats.sectors[S_CACHED] << 9);
+       sysfs_print(dirty_buckets,      stats.buckets[S_DIRTY]);
+       sysfs_hprint(cached_data,       stats.sectors_cached << 9);
+       sysfs_print(cached_bytes,       stats.sectors_cached << 9);
        sysfs_print(cached_buckets,     stats.buckets_cached);
-       sysfs_print(meta_buckets,       stats.buckets_meta);
+       sysfs_print(meta_buckets,       stats.buckets[S_META]);
        sysfs_print(alloc_buckets,      stats.buckets_alloc);
        sysfs_print(available_buckets,  dev_buckets_available(ca));
        sysfs_print(free_buckets,       dev_buckets_free(ca));
-       sysfs_print(has_data,           ca->mi.has_data);
-       sysfs_print(has_metadata,       ca->mi.has_metadata);
+
+       if (attr == &sysfs_has_data) {
+               out += bch2_scnprint_flag_list(out, end - out,
+                                              bch2_data_types,
+                                              bch2_dev_has_data(c, ca));
+               out += scnprintf(out, end - out, "\n");
+               return out - buf;
+       }
 
        sysfs_pd_controller_show(copy_gc, &ca->moving_gc_pd);
 
-       if (attr == &sysfs_cache_replacement_policy)
-               return bch2_snprint_string_list(buf, PAGE_SIZE,
-                                               bch2_cache_replacement_policies,
-                                               ca->mi.replacement);
+       if (attr == &sysfs_cache_replacement_policy) {
+               out += bch2_scnprint_string_list(out, end - out,
+                                                bch2_cache_replacement_policies,
+                                                ca->mi.replacement);
+               out += scnprintf(out, end - out, "\n");
+               return out - buf;
+       }
 
        sysfs_print(tier,               ca->mi.tier);
 
-       if (attr == &sysfs_state_rw)
-               return bch2_snprint_string_list(buf, PAGE_SIZE,
-                                               bch2_dev_state,
-                                               ca->mi.state);
+       if (attr == &sysfs_state_rw) {
+               out += bch2_scnprint_string_list(out, end - out,
+                                                bch2_dev_state,
+                                                ca->mi.state);
+               out += scnprintf(out, end - out, "\n");
+               return out - buf;
+       }
 
+       if (attr == &sysfs_iostats)
+               return show_dev_iostats(ca, buf);
        if (attr == &sysfs_read_priority_stats)
                return show_quantiles(ca, buf, bucket_priority_fn, (void *) 0);
        if (attr == &sysfs_write_priority_stats)
@@ -834,8 +885,8 @@ STORE(bch2_dev)
                SET_BCH_MEMBER_TIER(mi, v);
                bch2_write_super(c);
 
-               bch2_dev_group_remove(&c->tiers[prev_tier].devs, ca);
-               bch2_dev_group_add(&c->tiers[ca->mi.tier].devs, ca);
+               clear_bit(ca->dev_idx, c->tiers[prev_tier].devs.d);
+               set_bit(ca->dev_idx, c->tiers[ca->mi.tier].devs.d);
                mutex_unlock(&c->sb_lock);
 
                bch2_recalc_capacity(c);
@@ -860,12 +911,7 @@ struct attribute *bch2_dev_files[] = {
        &sysfs_state_rw,
 
        &sysfs_has_data,
-       &sysfs_has_metadata,
-
-       /* io stats: */
-       &sysfs_written,
-       &sysfs_btree_written,
-       &sysfs_metadata_written,
+       &sysfs_iostats,
 
        /* alloc info - data: */
        &sysfs_dirty_data,
@@ -894,3 +940,5 @@ struct attribute *bch2_dev_files[] = {
        sysfs_pd_controller_files(copy_gc),
        NULL
 };
+
+#endif  /* _BCACHEFS_SYSFS_H_ */