diff options
author | Dmitry Monakhov <dmonakhov@openvz.org> | 2010-04-26 20:03:33 +0400 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2010-05-21 19:30:41 +0200 |
commit | dde9588853b1bde542eab247f8838c472806688f (patch) | |
tree | 9f9c68bf63120056517bbfce78b75e6820cc4c4b /include/linux/quota.h | |
parent | da8d1ba22fa1fd0c0e541a43d75ebb062589b14b (diff) | |
download | linux-stable-dde9588853b1bde542eab247f8838c472806688f.tar.gz linux-stable-dde9588853b1bde542eab247f8838c472806688f.tar.bz2 linux-stable-dde9588853b1bde542eab247f8838c472806688f.zip |
quota: Make quota stat accounting lockless.
Quota stats is mostly writable data structure. Let's alloc percpu
bucket for each value.
NOTE: dqstats_read() function is racy against dqstats_{inc,dec}
and may return inconsistent value. But this is ok since absolute
accuracy is not required.
Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'include/linux/quota.h')
-rw-r--r-- | include/linux/quota.h | 42 |
1 files changed, 34 insertions, 8 deletions
diff --git a/include/linux/quota.h b/include/linux/quota.h index b462916b2a0a..cdfde10481b7 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h @@ -174,6 +174,8 @@ enum { #include <linux/rwsem.h> #include <linux/spinlock.h> #include <linux/wait.h> +#include <linux/percpu.h> +#include <linux/smp.h> #include <linux/dqblk_xfs.h> #include <linux/dqblk_v1.h> @@ -238,19 +240,43 @@ static inline int info_dirty(struct mem_dqinfo *info) return test_bit(DQF_INFO_DIRTY_B, &info->dqi_flags); } +enum { + DQST_LOOKUPS, + DQST_DROPS, + DQST_READS, + DQST_WRITES, + DQST_CACHE_HITS, + DQST_ALLOC_DQUOTS, + DQST_FREE_DQUOTS, + DQST_SYNCS, + _DQST_DQSTAT_LAST +}; + struct dqstats { - int lookups; - int drops; - int reads; - int writes; - int cache_hits; - int allocated_dquots; - int free_dquots; - int syncs; + int stat[_DQST_DQSTAT_LAST]; }; +extern struct dqstats *dqstats_pcpu; extern struct dqstats dqstats; +static inline void dqstats_inc(unsigned int type) +{ +#ifdef CONFIG_SMP + per_cpu_ptr(dqstats_pcpu, smp_processor_id())->stat[type]++; +#else + dqstats.stat[type]++; +#endif +} + +static inline void dqstats_dec(unsigned int type) +{ +#ifdef CONFIG_SMP + per_cpu_ptr(dqstats_pcpu, smp_processor_id())->stat[type]--; +#else + dqstats.stat[type]--; +#endif +} + #define DQ_MOD_B 0 /* dquot modified since read */ #define DQ_BLKS_B 1 /* uid/gid has been warned about blk limit */ #define DQ_INODES_B 2 /* uid/gid has been warned about inode limit */ |