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>
This commit is contained in:
committed by
Jan Kara
parent
da8d1ba22f
commit
dde9588853
@@ -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);
|
||||
}
|
||||
|
||||
struct dqstats {
|
||||
int lookups;
|
||||
int drops;
|
||||
int reads;
|
||||
int writes;
|
||||
int cache_hits;
|
||||
int allocated_dquots;
|
||||
int free_dquots;
|
||||
int syncs;
|
||||
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 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 */
|
||||
|
||||
Reference in New Issue
Block a user