Switch the total number of dquots counter over to use the per-cpu stats implementation, and reintroduce the number of unused dquots counter dropped earlier in the series. Btw, I wonder if we should simply add these counters to /proc/fs/xfs/xqmstat instead of keeping the odd format and mostly superflous /proc/fs/xfs/xqm around. Signed-off-by: Christoph Hellwig <hch@xxxxxx> --- fs/xfs/xfs_dquot.c | 7 ++++--- fs/xfs/xfs_qm.c | 3 ++- fs/xfs/xfs_qm.h | 1 - fs/xfs/xfs_qm_stats.c | 4 ++-- fs/xfs/xfs_qm_stats.h | 5 +++++ 5 files changed, 13 insertions(+), 7 deletions(-) Index: xfs/fs/xfs/xfs_qm_stats.c =================================================================== --- xfs.orig/fs/xfs/xfs_qm_stats.c 2012-02-01 12:30:02.000000000 +0100 +++ xfs/fs/xfs/xfs_qm_stats.c 2012-02-01 12:30:48.359059367 +0100 @@ -52,9 +52,9 @@ static int xqm_proc_show(struct seq_file /* maximum; incore; ratio free to inuse; freelist */ seq_printf(m, "%d\t%d\t%d\t%u\n", 0, - xfs_Gqm? atomic_read(&xfs_Gqm->qm_totaldquots) : 0, + xqmstats_sum(XQMSTAT_END_XQMSTAT), 0, - 0); + xqmstats_sum(XQMSTAT_END_XQMSTAT + 1)); return 0; } Index: xfs/fs/xfs/xfs_qm_stats.h =================================================================== --- xfs.orig/fs/xfs/xfs_qm_stats.h 2012-02-01 12:30:02.000000000 +0100 +++ xfs/fs/xfs/xfs_qm_stats.h 2012-02-01 12:30:48.362392682 +0100 @@ -33,6 +33,9 @@ struct xqmstats { __uint32_t xs_qm_dqshake_reclaims; __uint32_t xs_qm_dqinact_reclaims; #define XQMSTAT_END_XQMSTAT 8 + __uint32_t xs_qm_dquots; + __uint32_t xs_qm_dquots_unused; +#define XQMSTAT_END_XQM (XQMSTAT_END_XQMSTAT + 4) }; DECLARE_PER_CPU(struct xqmstats, xqmstats); @@ -42,6 +45,7 @@ DECLARE_PER_CPU(struct xqmstats, xqmstat * wrong CPU's stat for now (also aggregated before reporting). */ # define XQM_STATS_INC(v) (per_cpu(xqmstats, current_cpu()).v++) +# define XQM_STATS_DEC(v) (per_cpu(xqmstats, current_cpu()).v--) extern void xfs_qm_init_procfs(void); extern void xfs_qm_cleanup_procfs(void); @@ -49,6 +53,7 @@ extern void xfs_qm_cleanup_procfs(void); #else # define XQM_STATS_INC(v) do { } while (0) +# define XQM_STATS_DEC(v) do { } while (0) static inline void xfs_qm_init_procfs(void) { }; static inline void xfs_qm_cleanup_procfs(void) { }; Index: xfs/fs/xfs/xfs_dquot.c =================================================================== --- xfs.orig/fs/xfs/xfs_dquot.c 2012-02-01 12:30:02.000000000 +0100 +++ xfs/fs/xfs/xfs_dquot.c 2012-02-01 12:30:48.362392682 +0100 @@ -72,8 +72,7 @@ xfs_qm_dqdestroy( mutex_destroy(&dqp->q_qlock); kmem_zone_free(xfs_Gqm->qm_dqzone, dqp); - - atomic_dec(&xfs_Gqm->qm_totaldquots); + XQM_STATS_DEC(xs_qm_dquots); } /* @@ -515,7 +514,7 @@ xfs_qm_dqread( if (!(type & XFS_DQ_USER)) lockdep_set_class(&dqp->q_qlock, &xfs_dquot_other_class); - atomic_inc(&xfs_Gqm->qm_totaldquots); + XQM_STATS_INC(xs_qm_dquots); trace_xfs_dqread(dqp); @@ -786,6 +785,7 @@ recurse: list_add_tail(&dqp->q_lru, &dqp->q_mount->m_quotainfo->qi_lru_list); dqp->q_mount->m_quotainfo->qi_lru_count++; + XQM_STATS_INC(xs_qm_dquots_unused); } mutex_unlock(&dqp->q_mount->m_quotainfo->qi_lru_lock); @@ -1104,6 +1104,7 @@ xfs_qm_dqpurge( qi->qi_lru_count--; mutex_unlock(&qi->qi_lru_lock); + XQM_STATS_DEC(xs_qm_dquots_unused); xfs_qm_dqdestroy(dqp); return 0; } Index: xfs/fs/xfs/xfs_qm.c =================================================================== --- xfs.orig/fs/xfs/xfs_qm.c 2012-02-01 12:30:26.000000000 +0100 +++ xfs/fs/xfs/xfs_qm.c 2012-02-01 12:31:11.988931351 +0100 @@ -89,7 +89,6 @@ xfs_Gqm_init(void) } else xqm->qm_dqtrxzone = qm_dqtrxzone; - atomic_set(&xqm->qm_totaldquots, 0); xqm->qm_nrefs = 0; return xqm; } @@ -1522,6 +1521,7 @@ xfs_qm_dqreclaim_one( list_del_init(&dqp->q_lru); qi->qi_lru_count--; + XQM_STATS_DEC(xs_qm_dquots_unused); return; } @@ -1570,6 +1570,7 @@ xfs_qm_dqreclaim_one( ASSERT(dqp->q_nrefs == 0); list_move_tail(&dqp->q_lru, dispose_list); qi->qi_lru_count--; + XQM_STATS_DEC(xs_qm_dquots_unused); trace_xfs_dqreclaim_done(dqp); XQM_STATS_INC(xs_qm_dqreclaims); Index: xfs/fs/xfs/xfs_qm.h =================================================================== --- xfs.orig/fs/xfs/xfs_qm.h 2012-02-01 12:26:36.000000000 +0100 +++ xfs/fs/xfs/xfs_qm.h 2012-02-01 12:30:48.365725997 +0100 @@ -46,7 +46,6 @@ extern kmem_zone_t *qm_dqtrxzone; * Quota Manager (global) structure. Lives only in core. */ typedef struct xfs_qm { - atomic_t qm_totaldquots; /* total incore dquots */ uint qm_nrefs; /* file systems with quota on */ kmem_zone_t *qm_dqzone; /* dquot mem-alloc zone */ kmem_zone_t *qm_dqtrxzone; /* t_dqinfo of transactions */ _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs