xfs: use offsetof() in place of offset macros for __xfsstats

Most offset macro mess is used in xfs_stats_format() only, and we can
simply get the right offsets using offsetof(), instead of several macros
to mark the offsets inside __xfsstats structure.

Replace all XFSSTAT_END_* macros by a single helper macro to get the
right offset into __xfsstats, and use this helper in xfs_stats_format()
directly.

The quota stats code, still looks a bit cleaner when using XFSSTAT_*
macros, so, this patch also defines XFSSTAT_START_XQMSTAT and
XFSSTAT_END_XQMSTAT locally to that code. This also should prevent
offset mistakes when updates are done into __xfsstats.

Signed-off-by: Carlos Maiolino <cmaiolino@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
Carlos Maiolino 2018-10-18 17:21:39 +11:00 committed by Dave Chinner
parent 41657e5507
commit 26ca39015e
2 changed files with 31 additions and 49 deletions

View File

@ -29,30 +29,30 @@ int xfs_stats_format(struct xfsstats __percpu *stats, char *buf)
char *desc; char *desc;
int endpoint; int endpoint;
} xstats[] = { } xstats[] = {
{ "extent_alloc", XFSSTAT_END_EXTENT_ALLOC }, { "extent_alloc", xfsstats_offset(xs_abt_lookup) },
{ "abt", XFSSTAT_END_ALLOC_BTREE }, { "abt", xfsstats_offset(xs_blk_mapr) },
{ "blk_map", XFSSTAT_END_BLOCK_MAPPING }, { "blk_map", xfsstats_offset(xs_bmbt_lookup) },
{ "bmbt", XFSSTAT_END_BLOCK_MAP_BTREE }, { "bmbt", xfsstats_offset(xs_dir_lookup) },
{ "dir", XFSSTAT_END_DIRECTORY_OPS }, { "dir", xfsstats_offset(xs_trans_sync) },
{ "trans", XFSSTAT_END_TRANSACTIONS }, { "trans", xfsstats_offset(xs_ig_attempts) },
{ "ig", XFSSTAT_END_INODE_OPS }, { "ig", xfsstats_offset(xs_log_writes) },
{ "log", XFSSTAT_END_LOG_OPS }, { "log", xfsstats_offset(xs_try_logspace)},
{ "push_ail", XFSSTAT_END_TAIL_PUSHING }, { "push_ail", xfsstats_offset(xs_xstrat_quick)},
{ "xstrat", XFSSTAT_END_WRITE_CONVERT }, { "xstrat", xfsstats_offset(xs_write_calls) },
{ "rw", XFSSTAT_END_READ_WRITE_OPS }, { "rw", xfsstats_offset(xs_attr_get) },
{ "attr", XFSSTAT_END_ATTRIBUTE_OPS }, { "attr", xfsstats_offset(xs_iflush_count)},
{ "icluster", XFSSTAT_END_INODE_CLUSTER }, { "icluster", xfsstats_offset(vn_active) },
{ "vnodes", XFSSTAT_END_VNODE_OPS }, { "vnodes", xfsstats_offset(xb_get) },
{ "buf", XFSSTAT_END_BUF }, { "buf", xfsstats_offset(xs_abtb_2) },
{ "abtb2", XFSSTAT_END_ABTB_V2 }, { "abtb2", xfsstats_offset(xs_abtc_2) },
{ "abtc2", XFSSTAT_END_ABTC_V2 }, { "abtc2", xfsstats_offset(xs_bmbt_2) },
{ "bmbt2", XFSSTAT_END_BMBT_V2 }, { "bmbt2", xfsstats_offset(xs_ibt_2) },
{ "ibt2", XFSSTAT_END_IBT_V2 }, { "ibt2", xfsstats_offset(xs_fibt_2) },
{ "fibt2", XFSSTAT_END_FIBT_V2 }, { "fibt2", xfsstats_offset(xs_rmap_2) },
{ "rmapbt", XFSSTAT_END_RMAP_V2 }, { "rmapbt", xfsstats_offset(xs_refcbt_2) },
{ "refcntbt", XFSSTAT_END_REFCOUNT }, { "refcntbt", xfsstats_offset(xs_qm_dqreclaims)},
/* we print both series of quota information together */ /* we print both series of quota information together */
{ "qm", XFSSTAT_END_QM }, { "qm", xfsstats_offset(xs_xstrat_bytes)},
}; };
/* Loop over all stats groups */ /* Loop over all stats groups */
@ -104,6 +104,10 @@ void xfs_stats_clearall(struct xfsstats __percpu *stats)
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
/* legacy quota interfaces */ /* legacy quota interfaces */
#ifdef CONFIG_XFS_QUOTA #ifdef CONFIG_XFS_QUOTA
#define XFSSTAT_START_XQMSTAT xfsstats_offset(xs_qm_dqreclaims)
#define XFSSTAT_END_XQMSTAT xfsstats_offset(xs_qm_dquot)
static int xqm_proc_show(struct seq_file *m, void *v) static int xqm_proc_show(struct seq_file *m, void *v)
{ {
/* maximum; incore; ratio free to inuse; freelist */ /* maximum; incore; ratio free to inuse; freelist */
@ -119,7 +123,7 @@ static int xqmstat_proc_show(struct seq_file *m, void *v)
int j; int j;
seq_printf(m, "qm"); seq_printf(m, "qm");
for (j = XFSSTAT_END_REFCOUNT; j < XFSSTAT_END_XQMSTAT; j++) for (j = XFSSTAT_START_XQMSTAT; j < XFSSTAT_END_XQMSTAT; j++)
seq_printf(m, " %u", counter_val(xfsstats.xs_stats, j)); seq_printf(m, " %u", counter_val(xfsstats.xs_stats, j));
seq_putc(m, '\n'); seq_putc(m, '\n');
return 0; return 0;

View File

@ -41,17 +41,14 @@ enum {
* XFS global statistics * XFS global statistics
*/ */
struct __xfsstats { struct __xfsstats {
# define XFSSTAT_END_EXTENT_ALLOC 4
uint32_t xs_allocx; uint32_t xs_allocx;
uint32_t xs_allocb; uint32_t xs_allocb;
uint32_t xs_freex; uint32_t xs_freex;
uint32_t xs_freeb; uint32_t xs_freeb;
# define XFSSTAT_END_ALLOC_BTREE (XFSSTAT_END_EXTENT_ALLOC+4)
uint32_t xs_abt_lookup; uint32_t xs_abt_lookup;
uint32_t xs_abt_compare; uint32_t xs_abt_compare;
uint32_t xs_abt_insrec; uint32_t xs_abt_insrec;
uint32_t xs_abt_delrec; uint32_t xs_abt_delrec;
# define XFSSTAT_END_BLOCK_MAPPING (XFSSTAT_END_ALLOC_BTREE+7)
uint32_t xs_blk_mapr; uint32_t xs_blk_mapr;
uint32_t xs_blk_mapw; uint32_t xs_blk_mapw;
uint32_t xs_blk_unmap; uint32_t xs_blk_unmap;
@ -59,21 +56,17 @@ struct __xfsstats {
uint32_t xs_del_exlist; uint32_t xs_del_exlist;
uint32_t xs_look_exlist; uint32_t xs_look_exlist;
uint32_t xs_cmp_exlist; uint32_t xs_cmp_exlist;
# define XFSSTAT_END_BLOCK_MAP_BTREE (XFSSTAT_END_BLOCK_MAPPING+4)
uint32_t xs_bmbt_lookup; uint32_t xs_bmbt_lookup;
uint32_t xs_bmbt_compare; uint32_t xs_bmbt_compare;
uint32_t xs_bmbt_insrec; uint32_t xs_bmbt_insrec;
uint32_t xs_bmbt_delrec; uint32_t xs_bmbt_delrec;
# define XFSSTAT_END_DIRECTORY_OPS (XFSSTAT_END_BLOCK_MAP_BTREE+4)
uint32_t xs_dir_lookup; uint32_t xs_dir_lookup;
uint32_t xs_dir_create; uint32_t xs_dir_create;
uint32_t xs_dir_remove; uint32_t xs_dir_remove;
uint32_t xs_dir_getdents; uint32_t xs_dir_getdents;
# define XFSSTAT_END_TRANSACTIONS (XFSSTAT_END_DIRECTORY_OPS+3)
uint32_t xs_trans_sync; uint32_t xs_trans_sync;
uint32_t xs_trans_async; uint32_t xs_trans_async;
uint32_t xs_trans_empty; uint32_t xs_trans_empty;
# define XFSSTAT_END_INODE_OPS (XFSSTAT_END_TRANSACTIONS+7)
uint32_t xs_ig_attempts; uint32_t xs_ig_attempts;
uint32_t xs_ig_found; uint32_t xs_ig_found;
uint32_t xs_ig_frecycle; uint32_t xs_ig_frecycle;
@ -81,13 +74,11 @@ struct __xfsstats {
uint32_t xs_ig_dup; uint32_t xs_ig_dup;
uint32_t xs_ig_reclaims; uint32_t xs_ig_reclaims;
uint32_t xs_ig_attrchg; uint32_t xs_ig_attrchg;
# define XFSSTAT_END_LOG_OPS (XFSSTAT_END_INODE_OPS+5)
uint32_t xs_log_writes; uint32_t xs_log_writes;
uint32_t xs_log_blocks; uint32_t xs_log_blocks;
uint32_t xs_log_noiclogs; uint32_t xs_log_noiclogs;
uint32_t xs_log_force; uint32_t xs_log_force;
uint32_t xs_log_force_sleep; uint32_t xs_log_force_sleep;
# define XFSSTAT_END_TAIL_PUSHING (XFSSTAT_END_LOG_OPS+10)
uint32_t xs_try_logspace; uint32_t xs_try_logspace;
uint32_t xs_sleep_logspace; uint32_t xs_sleep_logspace;
uint32_t xs_push_ail; uint32_t xs_push_ail;
@ -98,22 +89,17 @@ struct __xfsstats {
uint32_t xs_push_ail_flushing; uint32_t xs_push_ail_flushing;
uint32_t xs_push_ail_restarts; uint32_t xs_push_ail_restarts;
uint32_t xs_push_ail_flush; uint32_t xs_push_ail_flush;
# define XFSSTAT_END_WRITE_CONVERT (XFSSTAT_END_TAIL_PUSHING+2)
uint32_t xs_xstrat_quick; uint32_t xs_xstrat_quick;
uint32_t xs_xstrat_split; uint32_t xs_xstrat_split;
# define XFSSTAT_END_READ_WRITE_OPS (XFSSTAT_END_WRITE_CONVERT+2)
uint32_t xs_write_calls; uint32_t xs_write_calls;
uint32_t xs_read_calls; uint32_t xs_read_calls;
# define XFSSTAT_END_ATTRIBUTE_OPS (XFSSTAT_END_READ_WRITE_OPS+4)
uint32_t xs_attr_get; uint32_t xs_attr_get;
uint32_t xs_attr_set; uint32_t xs_attr_set;
uint32_t xs_attr_remove; uint32_t xs_attr_remove;
uint32_t xs_attr_list; uint32_t xs_attr_list;
# define XFSSTAT_END_INODE_CLUSTER (XFSSTAT_END_ATTRIBUTE_OPS+3)
uint32_t xs_iflush_count; uint32_t xs_iflush_count;
uint32_t xs_icluster_flushcnt; uint32_t xs_icluster_flushcnt;
uint32_t xs_icluster_flushinode; uint32_t xs_icluster_flushinode;
# define XFSSTAT_END_VNODE_OPS (XFSSTAT_END_INODE_CLUSTER+8)
uint32_t vn_active; /* # vnodes not on free lists */ uint32_t vn_active; /* # vnodes not on free lists */
uint32_t vn_alloc; /* # times vn_alloc called */ uint32_t vn_alloc; /* # times vn_alloc called */
uint32_t vn_get; /* # times vn_get called */ uint32_t vn_get; /* # times vn_get called */
@ -122,7 +108,6 @@ struct __xfsstats {
uint32_t vn_reclaim; /* # times vn_reclaim called */ uint32_t vn_reclaim; /* # times vn_reclaim called */
uint32_t vn_remove; /* # times vn_remove called */ uint32_t vn_remove; /* # times vn_remove called */
uint32_t vn_free; /* # times vn_free called */ uint32_t vn_free; /* # times vn_free called */
#define XFSSTAT_END_BUF (XFSSTAT_END_VNODE_OPS+9)
uint32_t xb_get; uint32_t xb_get;
uint32_t xb_create; uint32_t xb_create;
uint32_t xb_get_locked; uint32_t xb_get_locked;
@ -133,28 +118,19 @@ struct __xfsstats {
uint32_t xb_page_found; uint32_t xb_page_found;
uint32_t xb_get_read; uint32_t xb_get_read;
/* Version 2 btree counters */ /* Version 2 btree counters */
#define XFSSTAT_END_ABTB_V2 (XFSSTAT_END_BUF + __XBTS_MAX)
uint32_t xs_abtb_2[__XBTS_MAX]; uint32_t xs_abtb_2[__XBTS_MAX];
#define XFSSTAT_END_ABTC_V2 (XFSSTAT_END_ABTB_V2 + __XBTS_MAX)
uint32_t xs_abtc_2[__XBTS_MAX]; uint32_t xs_abtc_2[__XBTS_MAX];
#define XFSSTAT_END_BMBT_V2 (XFSSTAT_END_ABTC_V2 + __XBTS_MAX)
uint32_t xs_bmbt_2[__XBTS_MAX]; uint32_t xs_bmbt_2[__XBTS_MAX];
#define XFSSTAT_END_IBT_V2 (XFSSTAT_END_BMBT_V2 + __XBTS_MAX)
uint32_t xs_ibt_2[__XBTS_MAX]; uint32_t xs_ibt_2[__XBTS_MAX];
#define XFSSTAT_END_FIBT_V2 (XFSSTAT_END_IBT_V2 + __XBTS_MAX)
uint32_t xs_fibt_2[__XBTS_MAX]; uint32_t xs_fibt_2[__XBTS_MAX];
#define XFSSTAT_END_RMAP_V2 (XFSSTAT_END_FIBT_V2 + __XBTS_MAX)
uint32_t xs_rmap_2[__XBTS_MAX]; uint32_t xs_rmap_2[__XBTS_MAX];
#define XFSSTAT_END_REFCOUNT (XFSSTAT_END_RMAP_V2 + __XBTS_MAX)
uint32_t xs_refcbt_2[__XBTS_MAX]; uint32_t xs_refcbt_2[__XBTS_MAX];
#define XFSSTAT_END_XQMSTAT (XFSSTAT_END_REFCOUNT + 6)
uint32_t xs_qm_dqreclaims; uint32_t xs_qm_dqreclaims;
uint32_t xs_qm_dqreclaim_misses; uint32_t xs_qm_dqreclaim_misses;
uint32_t xs_qm_dquot_dups; uint32_t xs_qm_dquot_dups;
uint32_t xs_qm_dqcachemisses; uint32_t xs_qm_dqcachemisses;
uint32_t xs_qm_dqcachehits; uint32_t xs_qm_dqcachehits;
uint32_t xs_qm_dqwants; uint32_t xs_qm_dqwants;
#define XFSSTAT_END_QM (XFSSTAT_END_XQMSTAT+2)
uint32_t xs_qm_dquot; uint32_t xs_qm_dquot;
uint32_t xs_qm_dquot_unused; uint32_t xs_qm_dquot_unused;
/* Extra precision counters */ /* Extra precision counters */
@ -163,10 +139,12 @@ struct __xfsstats {
uint64_t xs_read_bytes; uint64_t xs_read_bytes;
}; };
#define xfsstats_offset(f) (offsetof(struct __xfsstats, f)/sizeof(uint32_t))
struct xfsstats { struct xfsstats {
union { union {
struct __xfsstats s; struct __xfsstats s;
uint32_t a[XFSSTAT_END_XQMSTAT]; uint32_t a[xfsstats_offset(xs_qm_dquot)];
}; };
}; };