Skip to content

Commit

Permalink
bcachefs: add counter_flags for counters
Browse files Browse the repository at this point in the history
In bcachefs, io_read and io_write counter record the amount
of data which has been read and written. They increase in
unit of sector, so to display correctly, they need to be
shifted to the left by the size of a sector. Other counters
like io_move, move_extent_{read, write, finish} also have
this problem.

In order to support different unit, we add extra column to
mark the counter type by using TYPE_COUNTER and TYPE_SECTORS
in BCH_PERSISTENT_COUNTERS().

Fixes: 1c6fdbd ("bcachefs: Initial commit")
Signed-off-by: Hongbo Li <[email protected]>
Signed-off-by: Kent Overstreet <[email protected]>
  • Loading branch information
Hongbo Li authored and Kent Overstreet committed Dec 12, 2024
1 parent a5477fe commit f8ed207
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 81 deletions.
165 changes: 85 additions & 80 deletions fs/bcachefs/sb-counters_format.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,86 +2,91 @@
#ifndef _BCACHEFS_SB_COUNTERS_FORMAT_H
#define _BCACHEFS_SB_COUNTERS_FORMAT_H

#define BCH_PERSISTENT_COUNTERS() \
x(io_read, 0) \
x(io_write, 1) \
x(io_move, 2) \
x(bucket_invalidate, 3) \
x(bucket_discard, 4) \
x(bucket_alloc, 5) \
x(bucket_alloc_fail, 6) \
x(btree_cache_scan, 7) \
x(btree_cache_reap, 8) \
x(btree_cache_cannibalize, 9) \
x(btree_cache_cannibalize_lock, 10) \
x(btree_cache_cannibalize_lock_fail, 11) \
x(btree_cache_cannibalize_unlock, 12) \
x(btree_node_write, 13) \
x(btree_node_read, 14) \
x(btree_node_compact, 15) \
x(btree_node_merge, 16) \
x(btree_node_split, 17) \
x(btree_node_rewrite, 18) \
x(btree_node_alloc, 19) \
x(btree_node_free, 20) \
x(btree_node_set_root, 21) \
x(btree_path_relock_fail, 22) \
x(btree_path_upgrade_fail, 23) \
x(btree_reserve_get_fail, 24) \
x(journal_entry_full, 25) \
x(journal_full, 26) \
x(journal_reclaim_finish, 27) \
x(journal_reclaim_start, 28) \
x(journal_write, 29) \
x(read_promote, 30) \
x(read_bounce, 31) \
x(read_split, 33) \
x(read_retry, 32) \
x(read_reuse_race, 34) \
x(move_extent_read, 35) \
x(move_extent_write, 36) \
x(move_extent_finish, 37) \
x(move_extent_fail, 38) \
x(move_extent_start_fail, 39) \
x(copygc, 40) \
x(copygc_wait, 41) \
x(gc_gens_end, 42) \
x(gc_gens_start, 43) \
x(trans_blocked_journal_reclaim, 44) \
x(trans_restart_btree_node_reused, 45) \
x(trans_restart_btree_node_split, 46) \
x(trans_restart_fault_inject, 47) \
x(trans_restart_iter_upgrade, 48) \
x(trans_restart_journal_preres_get, 49) \
x(trans_restart_journal_reclaim, 50) \
x(trans_restart_journal_res_get, 51) \
x(trans_restart_key_cache_key_realloced, 52) \
x(trans_restart_key_cache_raced, 53) \
x(trans_restart_mark_replicas, 54) \
x(trans_restart_mem_realloced, 55) \
x(trans_restart_memory_allocation_failure, 56) \
x(trans_restart_relock, 57) \
x(trans_restart_relock_after_fill, 58) \
x(trans_restart_relock_key_cache_fill, 59) \
x(trans_restart_relock_next_node, 60) \
x(trans_restart_relock_parent_for_fill, 61) \
x(trans_restart_relock_path, 62) \
x(trans_restart_relock_path_intent, 63) \
x(trans_restart_too_many_iters, 64) \
x(trans_restart_traverse, 65) \
x(trans_restart_upgrade, 66) \
x(trans_restart_would_deadlock, 67) \
x(trans_restart_would_deadlock_write, 68) \
x(trans_restart_injected, 69) \
x(trans_restart_key_cache_upgrade, 70) \
x(trans_traverse_all, 71) \
x(transaction_commit, 72) \
x(write_super, 73) \
x(trans_restart_would_deadlock_recursion_limit, 74) \
x(trans_restart_write_buffer_flush, 75) \
x(trans_restart_split_race, 76) \
x(write_buffer_flush_slowpath, 77) \
x(write_buffer_flush_sync, 78)
enum counters_flags {
TYPE_COUNTER = BIT(0), /* event counters */
TYPE_SECTORS = BIT(1), /* amount counters, the unit is sectors */
};

#define BCH_PERSISTENT_COUNTERS() \
x(io_read, 0, TYPE_SECTORS) \
x(io_write, 1, TYPE_SECTORS) \
x(io_move, 2, TYPE_SECTORS) \
x(bucket_invalidate, 3, TYPE_COUNTER) \
x(bucket_discard, 4, TYPE_COUNTER) \
x(bucket_alloc, 5, TYPE_COUNTER) \
x(bucket_alloc_fail, 6, TYPE_COUNTER) \
x(btree_cache_scan, 7, TYPE_COUNTER) \
x(btree_cache_reap, 8, TYPE_COUNTER) \
x(btree_cache_cannibalize, 9, TYPE_COUNTER) \
x(btree_cache_cannibalize_lock, 10, TYPE_COUNTER) \
x(btree_cache_cannibalize_lock_fail, 11, TYPE_COUNTER) \
x(btree_cache_cannibalize_unlock, 12, TYPE_COUNTER) \
x(btree_node_write, 13, TYPE_COUNTER) \
x(btree_node_read, 14, TYPE_COUNTER) \
x(btree_node_compact, 15, TYPE_COUNTER) \
x(btree_node_merge, 16, TYPE_COUNTER) \
x(btree_node_split, 17, TYPE_COUNTER) \
x(btree_node_rewrite, 18, TYPE_COUNTER) \
x(btree_node_alloc, 19, TYPE_COUNTER) \
x(btree_node_free, 20, TYPE_COUNTER) \
x(btree_node_set_root, 21, TYPE_COUNTER) \
x(btree_path_relock_fail, 22, TYPE_COUNTER) \
x(btree_path_upgrade_fail, 23, TYPE_COUNTER) \
x(btree_reserve_get_fail, 24, TYPE_COUNTER) \
x(journal_entry_full, 25, TYPE_COUNTER) \
x(journal_full, 26, TYPE_COUNTER) \
x(journal_reclaim_finish, 27, TYPE_COUNTER) \
x(journal_reclaim_start, 28, TYPE_COUNTER) \
x(journal_write, 29, TYPE_COUNTER) \
x(read_promote, 30, TYPE_COUNTER) \
x(read_bounce, 31, TYPE_COUNTER) \
x(read_split, 33, TYPE_COUNTER) \
x(read_retry, 32, TYPE_COUNTER) \
x(read_reuse_race, 34, TYPE_COUNTER) \
x(move_extent_read, 35, TYPE_SECTORS) \
x(move_extent_write, 36, TYPE_SECTORS) \
x(move_extent_finish, 37, TYPE_SECTORS) \
x(move_extent_fail, 38, TYPE_COUNTER) \
x(move_extent_start_fail, 39, TYPE_COUNTER) \
x(copygc, 40, TYPE_COUNTER) \
x(copygc_wait, 41, TYPE_COUNTER) \
x(gc_gens_end, 42, TYPE_COUNTER) \
x(gc_gens_start, 43, TYPE_COUNTER) \
x(trans_blocked_journal_reclaim, 44, TYPE_COUNTER) \
x(trans_restart_btree_node_reused, 45, TYPE_COUNTER) \
x(trans_restart_btree_node_split, 46, TYPE_COUNTER) \
x(trans_restart_fault_inject, 47, TYPE_COUNTER) \
x(trans_restart_iter_upgrade, 48, TYPE_COUNTER) \
x(trans_restart_journal_preres_get, 49, TYPE_COUNTER) \
x(trans_restart_journal_reclaim, 50, TYPE_COUNTER) \
x(trans_restart_journal_res_get, 51, TYPE_COUNTER) \
x(trans_restart_key_cache_key_realloced, 52, TYPE_COUNTER) \
x(trans_restart_key_cache_raced, 53, TYPE_COUNTER) \
x(trans_restart_mark_replicas, 54, TYPE_COUNTER) \
x(trans_restart_mem_realloced, 55, TYPE_COUNTER) \
x(trans_restart_memory_allocation_failure, 56, TYPE_COUNTER) \
x(trans_restart_relock, 57, TYPE_COUNTER) \
x(trans_restart_relock_after_fill, 58, TYPE_COUNTER) \
x(trans_restart_relock_key_cache_fill, 59, TYPE_COUNTER) \
x(trans_restart_relock_next_node, 60, TYPE_COUNTER) \
x(trans_restart_relock_parent_for_fill, 61, TYPE_COUNTER) \
x(trans_restart_relock_path, 62, TYPE_COUNTER) \
x(trans_restart_relock_path_intent, 63, TYPE_COUNTER) \
x(trans_restart_too_many_iters, 64, TYPE_COUNTER) \
x(trans_restart_traverse, 65, TYPE_COUNTER) \
x(trans_restart_upgrade, 66, TYPE_COUNTER) \
x(trans_restart_would_deadlock, 67, TYPE_COUNTER) \
x(trans_restart_would_deadlock_write, 68, TYPE_COUNTER) \
x(trans_restart_injected, 69, TYPE_COUNTER) \
x(trans_restart_key_cache_upgrade, 70, TYPE_COUNTER) \
x(trans_traverse_all, 71, TYPE_COUNTER) \
x(transaction_commit, 72, TYPE_COUNTER) \
x(write_super, 73, TYPE_COUNTER) \
x(trans_restart_would_deadlock_recursion_limit, 74, TYPE_COUNTER) \
x(trans_restart_write_buffer_flush, 75, TYPE_COUNTER) \
x(trans_restart_split_race, 76, TYPE_COUNTER) \
x(write_buffer_flush_slowpath, 77, TYPE_COUNTER) \
x(write_buffer_flush_sync, 78, TYPE_COUNTER)

enum bch_persistent_counters {
#define x(t, n, ...) BCH_COUNTER_##t,
Expand Down
9 changes: 8 additions & 1 deletion fs/bcachefs/sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -505,15 +505,22 @@ SHOW(bch2_fs_counters)

printbuf_tabstop_push(out, 32);

#define x(t, ...) \
#define x(t, n, f, ...) \
if (attr == &sysfs_##t) { \
counter = percpu_u64_get(&c->counters[BCH_COUNTER_##t]);\
counter_since_mount = counter - c->counters_on_mount[BCH_COUNTER_##t];\
if (f & TYPE_SECTORS) { \
counter <<= 9; \
counter_since_mount <<= 9; \
} \
\
prt_printf(out, "since mount:\t"); \
(f & TYPE_COUNTER) ? prt_u64(out, counter_since_mount) :\
prt_human_readable_u64(out, counter_since_mount); \
prt_newline(out); \
\
prt_printf(out, "since filesystem creation:\t"); \
(f & TYPE_COUNTER) ? prt_u64(out, counter) : \
prt_human_readable_u64(out, counter); \
prt_newline(out); \
}
Expand Down

0 comments on commit f8ed207

Please sign in to comment.