1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000,2005 Silicon Graphics, Inc.
6 #ifndef __XFS_STATS_H__
7 #define __XFS_STATS_H__
10 #include <linux/percpu.h>
13 * The btree stats arrays have fixed offsets for the different stats. We
14 * store the base index in the btree cursor via XFS_STATS_CALC_INDEX() and
15 * that allows us to use fixed offsets into the stats array for each btree
16 * stat. These index offsets are defined in the order they will be emitted
17 * in the stats files, so it is possible to add new btree stat types by
18 * appending to the enum list below.
41 * XFS global statistics
48 uint32_t xs_abt_lookup
;
49 uint32_t xs_abt_compare
;
50 uint32_t xs_abt_insrec
;
51 uint32_t xs_abt_delrec
;
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
;
72 uint32_t xs_ig_frecycle
;
73 uint32_t xs_ig_missed
;
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
;
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
;
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 */
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_qm_dqreclaims
;
129 uint32_t xs_qm_dqreclaim_misses
;
130 uint32_t xs_qm_dquot_dups
;
131 uint32_t xs_qm_dqcachemisses
;
132 uint32_t xs_qm_dqcachehits
;
133 uint32_t xs_qm_dqwants
;
134 uint32_t xs_qm_dquot
;
135 uint32_t xs_qm_dquot_unused
;
136 /* Extra precision counters */
137 uint64_t xs_xstrat_bytes
;
138 uint64_t xs_write_bytes
;
139 uint64_t xs_read_bytes
;
142 #define xfsstats_offset(f) (offsetof(struct __xfsstats, f)/sizeof(uint32_t))
147 uint32_t a
[xfsstats_offset(xs_qm_dquot
)];
152 * simple wrapper for getting the array index of s struct member offset
154 #define XFS_STATS_CALC_INDEX(member) \
155 (offsetof(struct __xfsstats, member) / (int)sizeof(uint32_t))
158 int xfs_stats_format(struct xfsstats __percpu
*stats
, char *buf
);
159 void xfs_stats_clearall(struct xfsstats __percpu
*stats
);
160 extern struct xstats xfsstats
;
162 #define XFS_STATS_INC(mp, v) \
164 per_cpu_ptr(xfsstats.xs_stats, current_cpu())->s.v++; \
165 per_cpu_ptr(mp->m_stats.xs_stats, current_cpu())->s.v++; \
168 #define XFS_STATS_DEC(mp, v) \
170 per_cpu_ptr(xfsstats.xs_stats, current_cpu())->s.v--; \
171 per_cpu_ptr(mp->m_stats.xs_stats, current_cpu())->s.v--; \
174 #define XFS_STATS_ADD(mp, v, inc) \
176 per_cpu_ptr(xfsstats.xs_stats, current_cpu())->s.v += (inc); \
177 per_cpu_ptr(mp->m_stats.xs_stats, current_cpu())->s.v += (inc); \
180 #define XFS_STATS_INC_OFF(mp, off) \
182 per_cpu_ptr(xfsstats.xs_stats, current_cpu())->a[off]++; \
183 per_cpu_ptr(mp->m_stats.xs_stats, current_cpu())->a[off]++; \
186 #define XFS_STATS_DEC_OFF(mp, off) \
188 per_cpu_ptr(xfsstats.xs_stats, current_cpu())->a[off]; \
189 per_cpu_ptr(mp->m_stats.xs_stats, current_cpu())->a[off]; \
192 #define XFS_STATS_ADD_OFF(mp, off, inc) \
194 per_cpu_ptr(xfsstats.xs_stats, current_cpu())->a[off] += (inc); \
195 per_cpu_ptr(mp->m_stats.xs_stats, current_cpu())->a[off] += (inc); \
198 #if defined(CONFIG_PROC_FS)
200 extern int xfs_init_procfs(void);
201 extern void xfs_cleanup_procfs(void);
204 #else /* !CONFIG_PROC_FS */
206 static inline int xfs_init_procfs(void)
211 static inline void xfs_cleanup_procfs(void)
215 #endif /* !CONFIG_PROC_FS */
217 #endif /* __XFS_STATS_H__ */