221 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Copyright (c) 2000,2005 Silicon Graphics, Inc.4 * All Rights Reserved.5 */6#ifndef __XFS_STATS_H__7#define __XFS_STATS_H__8 9 10#include <linux/percpu.h>11 12/*13 * The btree stats arrays have fixed offsets for the different stats. We14 * store the base index in the btree cursor via XFS_STATS_CALC_INDEX() and15 * that allows us to use fixed offsets into the stats array for each btree16 * stat. These index offsets are defined in the order they will be emitted17 * in the stats files, so it is possible to add new btree stat types by18 * appending to the enum list below.19 */20enum {21 __XBTS_lookup = 0,22 __XBTS_compare = 1,23 __XBTS_insrec = 2,24 __XBTS_delrec = 3,25 __XBTS_newroot = 4,26 __XBTS_killroot = 5,27 __XBTS_increment = 6,28 __XBTS_decrement = 7,29 __XBTS_lshift = 8,30 __XBTS_rshift = 9,31 __XBTS_split = 10,32 __XBTS_join = 11,33 __XBTS_alloc = 12,34 __XBTS_free = 13,35 __XBTS_moves = 14,36 37 __XBTS_MAX = 15,38};39 40/*41 * XFS global statistics42 */43struct __xfsstats {44 uint32_t xs_allocx;45 uint32_t xs_allocb;46 uint32_t xs_freex;47 uint32_t xs_freeb;48 uint32_t xs_abt_lookup;49 uint32_t xs_abt_compare;50 uint32_t xs_abt_insrec;51 uint32_t xs_abt_delrec;52 uint32_t xs_blk_mapr;53 uint32_t xs_blk_mapw;54 uint32_t xs_blk_unmap;55 uint32_t xs_add_exlist;56 uint32_t xs_del_exlist;57 uint32_t xs_look_exlist;58 uint32_t xs_cmp_exlist;59 uint32_t xs_bmbt_lookup;60 uint32_t xs_bmbt_compare;61 uint32_t xs_bmbt_insrec;62 uint32_t xs_bmbt_delrec;63 uint32_t xs_dir_lookup;64 uint32_t xs_dir_create;65 uint32_t xs_dir_remove;66 uint32_t xs_dir_getdents;67 uint32_t xs_trans_sync;68 uint32_t xs_trans_async;69 uint32_t xs_trans_empty;70 uint32_t xs_ig_attempts;71 uint32_t xs_ig_found;72 uint32_t xs_ig_frecycle;73 uint32_t xs_ig_missed;74 uint32_t xs_ig_dup;75 uint32_t xs_ig_reclaims;76 uint32_t xs_ig_attrchg;77 uint32_t xs_log_writes;78 uint32_t xs_log_blocks;79 uint32_t xs_log_noiclogs;80 uint32_t xs_log_force;81 uint32_t xs_log_force_sleep;82 uint32_t xs_try_logspace;83 uint32_t xs_sleep_logspace;84 uint32_t xs_push_ail;85 uint32_t xs_push_ail_success;86 uint32_t xs_push_ail_pushbuf;87 uint32_t xs_push_ail_pinned;88 uint32_t xs_push_ail_locked;89 uint32_t xs_push_ail_flushing;90 uint32_t xs_push_ail_restarts;91 uint32_t xs_push_ail_flush;92 uint32_t xs_xstrat_quick;93 uint32_t xs_xstrat_split;94 uint32_t xs_write_calls;95 uint32_t xs_read_calls;96 uint32_t xs_attr_get;97 uint32_t xs_attr_set;98 uint32_t xs_attr_remove;99 uint32_t xs_attr_list;100 uint32_t xs_iflush_count;101 uint32_t xs_icluster_flushcnt;102 uint32_t xs_icluster_flushinode;103 uint32_t vn_active; /* # vnodes not on free lists */104 uint32_t vn_alloc; /* # times vn_alloc called */105 uint32_t vn_get; /* # times vn_get called */106 uint32_t vn_hold; /* # times vn_hold called */107 uint32_t vn_rele; /* # times vn_rele called */108 uint32_t vn_reclaim; /* # times vn_reclaim called */109 uint32_t vn_remove; /* # times vn_remove called */110 uint32_t vn_free; /* # times vn_free called */111 uint32_t xb_get;112 uint32_t xb_create;113 uint32_t xb_get_locked;114 uint32_t xb_get_locked_waited;115 uint32_t xb_busy_locked;116 uint32_t xb_miss_locked;117 uint32_t xb_page_retries;118 uint32_t xb_page_found;119 uint32_t xb_get_read;120/* Version 2 btree counters */121 uint32_t xs_abtb_2[__XBTS_MAX];122 uint32_t xs_abtc_2[__XBTS_MAX];123 uint32_t xs_bmbt_2[__XBTS_MAX];124 uint32_t xs_ibt_2[__XBTS_MAX];125 uint32_t xs_fibt_2[__XBTS_MAX];126 uint32_t xs_rmap_2[__XBTS_MAX];127 uint32_t xs_refcbt_2[__XBTS_MAX];128 uint32_t xs_rmap_mem_2[__XBTS_MAX];129 uint32_t xs_rcbag_2[__XBTS_MAX];130 uint32_t xs_qm_dqreclaims;131 uint32_t xs_qm_dqreclaim_misses;132 uint32_t xs_qm_dquot_dups;133 uint32_t xs_qm_dqcachemisses;134 uint32_t xs_qm_dqcachehits;135 uint32_t xs_qm_dqwants;136 uint32_t xs_qm_dquot;137 uint32_t xs_qm_dquot_unused;138/* Extra precision counters */139 uint64_t xs_xstrat_bytes;140 uint64_t xs_write_bytes;141 uint64_t xs_read_bytes;142 uint64_t defer_relog;143};144 145#define xfsstats_offset(f) (offsetof(struct __xfsstats, f)/sizeof(uint32_t))146 147struct xfsstats {148 union {149 struct __xfsstats s;150 uint32_t a[xfsstats_offset(xs_qm_dquot)];151 };152};153 154/*155 * simple wrapper for getting the array index of s struct member offset156 */157#define XFS_STATS_CALC_INDEX(member) \158 (offsetof(struct __xfsstats, member) / (int)sizeof(uint32_t))159 160 161int xfs_stats_format(struct xfsstats __percpu *stats, char *buf);162void xfs_stats_clearall(struct xfsstats __percpu *stats);163extern struct xstats xfsstats;164 165#define XFS_STATS_INC(mp, v) \166do { \167 per_cpu_ptr(xfsstats.xs_stats, current_cpu())->s.v++; \168 per_cpu_ptr(mp->m_stats.xs_stats, current_cpu())->s.v++; \169} while (0)170 171#define XFS_STATS_DEC(mp, v) \172do { \173 per_cpu_ptr(xfsstats.xs_stats, current_cpu())->s.v--; \174 per_cpu_ptr(mp->m_stats.xs_stats, current_cpu())->s.v--; \175} while (0)176 177#define XFS_STATS_ADD(mp, v, inc) \178do { \179 per_cpu_ptr(xfsstats.xs_stats, current_cpu())->s.v += (inc); \180 per_cpu_ptr(mp->m_stats.xs_stats, current_cpu())->s.v += (inc); \181} while (0)182 183#define XFS_STATS_INC_OFF(mp, off) \184do { \185 per_cpu_ptr(xfsstats.xs_stats, current_cpu())->a[off]++; \186 per_cpu_ptr(mp->m_stats.xs_stats, current_cpu())->a[off]++; \187} while (0)188 189#define XFS_STATS_DEC_OFF(mp, off) \190do { \191 per_cpu_ptr(xfsstats.xs_stats, current_cpu())->a[off]; \192 per_cpu_ptr(mp->m_stats.xs_stats, current_cpu())->a[off]; \193} while (0)194 195#define XFS_STATS_ADD_OFF(mp, off, inc) \196do { \197 per_cpu_ptr(xfsstats.xs_stats, current_cpu())->a[off] += (inc); \198 per_cpu_ptr(mp->m_stats.xs_stats, current_cpu())->a[off] += (inc); \199} while (0)200 201#if defined(CONFIG_PROC_FS)202 203extern int xfs_init_procfs(void);204extern void xfs_cleanup_procfs(void);205 206 207#else /* !CONFIG_PROC_FS */208 209static inline int xfs_init_procfs(void)210{211 return 0;212}213 214static inline void xfs_cleanup_procfs(void)215{216}217 218#endif /* !CONFIG_PROC_FS */219 220#endif /* __XFS_STATS_H__ */221