162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2000,2005 Silicon Graphics, Inc.
462306a36Sopenharmony_ci * All Rights Reserved.
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci#ifndef __XFS_STATS_H__
762306a36Sopenharmony_ci#define __XFS_STATS_H__
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/percpu.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci/*
1362306a36Sopenharmony_ci * The btree stats arrays have fixed offsets for the different stats. We
1462306a36Sopenharmony_ci * store the base index in the btree cursor via XFS_STATS_CALC_INDEX() and
1562306a36Sopenharmony_ci * that allows us to use fixed offsets into the stats array for each btree
1662306a36Sopenharmony_ci * stat. These index offsets are defined in the order they will be emitted
1762306a36Sopenharmony_ci * in the stats files, so it is possible to add new btree stat types by
1862306a36Sopenharmony_ci * appending to the enum list below.
1962306a36Sopenharmony_ci */
2062306a36Sopenharmony_cienum {
2162306a36Sopenharmony_ci	__XBTS_lookup = 0,
2262306a36Sopenharmony_ci	__XBTS_compare = 1,
2362306a36Sopenharmony_ci	__XBTS_insrec = 2,
2462306a36Sopenharmony_ci	__XBTS_delrec = 3,
2562306a36Sopenharmony_ci	__XBTS_newroot = 4,
2662306a36Sopenharmony_ci	__XBTS_killroot = 5,
2762306a36Sopenharmony_ci	__XBTS_increment = 6,
2862306a36Sopenharmony_ci	__XBTS_decrement = 7,
2962306a36Sopenharmony_ci	__XBTS_lshift = 8,
3062306a36Sopenharmony_ci	__XBTS_rshift = 9,
3162306a36Sopenharmony_ci	__XBTS_split = 10,
3262306a36Sopenharmony_ci	__XBTS_join = 11,
3362306a36Sopenharmony_ci	__XBTS_alloc = 12,
3462306a36Sopenharmony_ci	__XBTS_free = 13,
3562306a36Sopenharmony_ci	__XBTS_moves = 14,
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	__XBTS_MAX = 15,
3862306a36Sopenharmony_ci};
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci/*
4162306a36Sopenharmony_ci * XFS global statistics
4262306a36Sopenharmony_ci */
4362306a36Sopenharmony_cistruct __xfsstats {
4462306a36Sopenharmony_ci	uint32_t		xs_allocx;
4562306a36Sopenharmony_ci	uint32_t		xs_allocb;
4662306a36Sopenharmony_ci	uint32_t		xs_freex;
4762306a36Sopenharmony_ci	uint32_t		xs_freeb;
4862306a36Sopenharmony_ci	uint32_t		xs_abt_lookup;
4962306a36Sopenharmony_ci	uint32_t		xs_abt_compare;
5062306a36Sopenharmony_ci	uint32_t		xs_abt_insrec;
5162306a36Sopenharmony_ci	uint32_t		xs_abt_delrec;
5262306a36Sopenharmony_ci	uint32_t		xs_blk_mapr;
5362306a36Sopenharmony_ci	uint32_t		xs_blk_mapw;
5462306a36Sopenharmony_ci	uint32_t		xs_blk_unmap;
5562306a36Sopenharmony_ci	uint32_t		xs_add_exlist;
5662306a36Sopenharmony_ci	uint32_t		xs_del_exlist;
5762306a36Sopenharmony_ci	uint32_t		xs_look_exlist;
5862306a36Sopenharmony_ci	uint32_t		xs_cmp_exlist;
5962306a36Sopenharmony_ci	uint32_t		xs_bmbt_lookup;
6062306a36Sopenharmony_ci	uint32_t		xs_bmbt_compare;
6162306a36Sopenharmony_ci	uint32_t		xs_bmbt_insrec;
6262306a36Sopenharmony_ci	uint32_t		xs_bmbt_delrec;
6362306a36Sopenharmony_ci	uint32_t		xs_dir_lookup;
6462306a36Sopenharmony_ci	uint32_t		xs_dir_create;
6562306a36Sopenharmony_ci	uint32_t		xs_dir_remove;
6662306a36Sopenharmony_ci	uint32_t		xs_dir_getdents;
6762306a36Sopenharmony_ci	uint32_t		xs_trans_sync;
6862306a36Sopenharmony_ci	uint32_t		xs_trans_async;
6962306a36Sopenharmony_ci	uint32_t		xs_trans_empty;
7062306a36Sopenharmony_ci	uint32_t		xs_ig_attempts;
7162306a36Sopenharmony_ci	uint32_t		xs_ig_found;
7262306a36Sopenharmony_ci	uint32_t		xs_ig_frecycle;
7362306a36Sopenharmony_ci	uint32_t		xs_ig_missed;
7462306a36Sopenharmony_ci	uint32_t		xs_ig_dup;
7562306a36Sopenharmony_ci	uint32_t		xs_ig_reclaims;
7662306a36Sopenharmony_ci	uint32_t		xs_ig_attrchg;
7762306a36Sopenharmony_ci	uint32_t		xs_log_writes;
7862306a36Sopenharmony_ci	uint32_t		xs_log_blocks;
7962306a36Sopenharmony_ci	uint32_t		xs_log_noiclogs;
8062306a36Sopenharmony_ci	uint32_t		xs_log_force;
8162306a36Sopenharmony_ci	uint32_t		xs_log_force_sleep;
8262306a36Sopenharmony_ci	uint32_t		xs_try_logspace;
8362306a36Sopenharmony_ci	uint32_t		xs_sleep_logspace;
8462306a36Sopenharmony_ci	uint32_t		xs_push_ail;
8562306a36Sopenharmony_ci	uint32_t		xs_push_ail_success;
8662306a36Sopenharmony_ci	uint32_t		xs_push_ail_pushbuf;
8762306a36Sopenharmony_ci	uint32_t		xs_push_ail_pinned;
8862306a36Sopenharmony_ci	uint32_t		xs_push_ail_locked;
8962306a36Sopenharmony_ci	uint32_t		xs_push_ail_flushing;
9062306a36Sopenharmony_ci	uint32_t		xs_push_ail_restarts;
9162306a36Sopenharmony_ci	uint32_t		xs_push_ail_flush;
9262306a36Sopenharmony_ci	uint32_t		xs_xstrat_quick;
9362306a36Sopenharmony_ci	uint32_t		xs_xstrat_split;
9462306a36Sopenharmony_ci	uint32_t		xs_write_calls;
9562306a36Sopenharmony_ci	uint32_t		xs_read_calls;
9662306a36Sopenharmony_ci	uint32_t		xs_attr_get;
9762306a36Sopenharmony_ci	uint32_t		xs_attr_set;
9862306a36Sopenharmony_ci	uint32_t		xs_attr_remove;
9962306a36Sopenharmony_ci	uint32_t		xs_attr_list;
10062306a36Sopenharmony_ci	uint32_t		xs_iflush_count;
10162306a36Sopenharmony_ci	uint32_t		xs_icluster_flushcnt;
10262306a36Sopenharmony_ci	uint32_t		xs_icluster_flushinode;
10362306a36Sopenharmony_ci	uint32_t		vn_active;	/* # vnodes not on free lists */
10462306a36Sopenharmony_ci	uint32_t		vn_alloc;	/* # times vn_alloc called */
10562306a36Sopenharmony_ci	uint32_t		vn_get;		/* # times vn_get called */
10662306a36Sopenharmony_ci	uint32_t		vn_hold;	/* # times vn_hold called */
10762306a36Sopenharmony_ci	uint32_t		vn_rele;	/* # times vn_rele called */
10862306a36Sopenharmony_ci	uint32_t		vn_reclaim;	/* # times vn_reclaim called */
10962306a36Sopenharmony_ci	uint32_t		vn_remove;	/* # times vn_remove called */
11062306a36Sopenharmony_ci	uint32_t		vn_free;	/* # times vn_free called */
11162306a36Sopenharmony_ci	uint32_t		xb_get;
11262306a36Sopenharmony_ci	uint32_t		xb_create;
11362306a36Sopenharmony_ci	uint32_t		xb_get_locked;
11462306a36Sopenharmony_ci	uint32_t		xb_get_locked_waited;
11562306a36Sopenharmony_ci	uint32_t		xb_busy_locked;
11662306a36Sopenharmony_ci	uint32_t		xb_miss_locked;
11762306a36Sopenharmony_ci	uint32_t		xb_page_retries;
11862306a36Sopenharmony_ci	uint32_t		xb_page_found;
11962306a36Sopenharmony_ci	uint32_t		xb_get_read;
12062306a36Sopenharmony_ci/* Version 2 btree counters */
12162306a36Sopenharmony_ci	uint32_t		xs_abtb_2[__XBTS_MAX];
12262306a36Sopenharmony_ci	uint32_t		xs_abtc_2[__XBTS_MAX];
12362306a36Sopenharmony_ci	uint32_t		xs_bmbt_2[__XBTS_MAX];
12462306a36Sopenharmony_ci	uint32_t		xs_ibt_2[__XBTS_MAX];
12562306a36Sopenharmony_ci	uint32_t		xs_fibt_2[__XBTS_MAX];
12662306a36Sopenharmony_ci	uint32_t		xs_rmap_2[__XBTS_MAX];
12762306a36Sopenharmony_ci	uint32_t		xs_refcbt_2[__XBTS_MAX];
12862306a36Sopenharmony_ci	uint32_t		xs_qm_dqreclaims;
12962306a36Sopenharmony_ci	uint32_t		xs_qm_dqreclaim_misses;
13062306a36Sopenharmony_ci	uint32_t		xs_qm_dquot_dups;
13162306a36Sopenharmony_ci	uint32_t		xs_qm_dqcachemisses;
13262306a36Sopenharmony_ci	uint32_t		xs_qm_dqcachehits;
13362306a36Sopenharmony_ci	uint32_t		xs_qm_dqwants;
13462306a36Sopenharmony_ci	uint32_t		xs_qm_dquot;
13562306a36Sopenharmony_ci	uint32_t		xs_qm_dquot_unused;
13662306a36Sopenharmony_ci/* Extra precision counters */
13762306a36Sopenharmony_ci	uint64_t		xs_xstrat_bytes;
13862306a36Sopenharmony_ci	uint64_t		xs_write_bytes;
13962306a36Sopenharmony_ci	uint64_t		xs_read_bytes;
14062306a36Sopenharmony_ci	uint64_t		defer_relog;
14162306a36Sopenharmony_ci};
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci#define	xfsstats_offset(f)	(offsetof(struct __xfsstats, f)/sizeof(uint32_t))
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_cistruct xfsstats {
14662306a36Sopenharmony_ci	union {
14762306a36Sopenharmony_ci		struct __xfsstats	s;
14862306a36Sopenharmony_ci		uint32_t		a[xfsstats_offset(xs_qm_dquot)];
14962306a36Sopenharmony_ci	};
15062306a36Sopenharmony_ci};
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci/*
15362306a36Sopenharmony_ci * simple wrapper for getting the array index of s struct member offset
15462306a36Sopenharmony_ci */
15562306a36Sopenharmony_ci#define XFS_STATS_CALC_INDEX(member)	\
15662306a36Sopenharmony_ci	(offsetof(struct __xfsstats, member) / (int)sizeof(uint32_t))
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ciint xfs_stats_format(struct xfsstats __percpu *stats, char *buf);
16062306a36Sopenharmony_civoid xfs_stats_clearall(struct xfsstats __percpu *stats);
16162306a36Sopenharmony_ciextern struct xstats xfsstats;
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci#define XFS_STATS_INC(mp, v)					\
16462306a36Sopenharmony_cido {								\
16562306a36Sopenharmony_ci	per_cpu_ptr(xfsstats.xs_stats, current_cpu())->s.v++;	\
16662306a36Sopenharmony_ci	per_cpu_ptr(mp->m_stats.xs_stats, current_cpu())->s.v++;	\
16762306a36Sopenharmony_ci} while (0)
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci#define XFS_STATS_DEC(mp, v)					\
17062306a36Sopenharmony_cido {								\
17162306a36Sopenharmony_ci	per_cpu_ptr(xfsstats.xs_stats, current_cpu())->s.v--;	\
17262306a36Sopenharmony_ci	per_cpu_ptr(mp->m_stats.xs_stats, current_cpu())->s.v--;	\
17362306a36Sopenharmony_ci} while (0)
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_ci#define XFS_STATS_ADD(mp, v, inc)					\
17662306a36Sopenharmony_cido {									\
17762306a36Sopenharmony_ci	per_cpu_ptr(xfsstats.xs_stats, current_cpu())->s.v += (inc);	\
17862306a36Sopenharmony_ci	per_cpu_ptr(mp->m_stats.xs_stats, current_cpu())->s.v += (inc);	\
17962306a36Sopenharmony_ci} while (0)
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci#define XFS_STATS_INC_OFF(mp, off)				\
18262306a36Sopenharmony_cido {								\
18362306a36Sopenharmony_ci	per_cpu_ptr(xfsstats.xs_stats, current_cpu())->a[off]++;	\
18462306a36Sopenharmony_ci	per_cpu_ptr(mp->m_stats.xs_stats, current_cpu())->a[off]++;	\
18562306a36Sopenharmony_ci} while (0)
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci#define XFS_STATS_DEC_OFF(mp, off)					\
18862306a36Sopenharmony_cido {								\
18962306a36Sopenharmony_ci	per_cpu_ptr(xfsstats.xs_stats, current_cpu())->a[off];	\
19062306a36Sopenharmony_ci	per_cpu_ptr(mp->m_stats.xs_stats, current_cpu())->a[off];	\
19162306a36Sopenharmony_ci} while (0)
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ci#define XFS_STATS_ADD_OFF(mp, off, inc)					\
19462306a36Sopenharmony_cido {									\
19562306a36Sopenharmony_ci	per_cpu_ptr(xfsstats.xs_stats, current_cpu())->a[off] += (inc);	\
19662306a36Sopenharmony_ci	per_cpu_ptr(mp->m_stats.xs_stats, current_cpu())->a[off] += (inc);	\
19762306a36Sopenharmony_ci} while (0)
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_ci#if defined(CONFIG_PROC_FS)
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ciextern int xfs_init_procfs(void);
20262306a36Sopenharmony_ciextern void xfs_cleanup_procfs(void);
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_ci#else	/* !CONFIG_PROC_FS */
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_cistatic inline int xfs_init_procfs(void)
20862306a36Sopenharmony_ci{
20962306a36Sopenharmony_ci	return 0;
21062306a36Sopenharmony_ci}
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_cistatic inline void xfs_cleanup_procfs(void)
21362306a36Sopenharmony_ci{
21462306a36Sopenharmony_ci}
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci#endif	/* !CONFIG_PROC_FS */
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci#endif /* __XFS_STATS_H__ */
219