On Mon, Aug 8, 2011 at 10:03 AM, Dave Chinner <david@xxxxxxxxxxxxx> wrote: > From: Dave Chinner <dchinner@xxxxxxxxxx> > > Before we split up the dcache_lru_lock, the unused dentry counter > needs to be made independent of the global dcache_lru_lock. Convert > it to per-cpu counters to do this. > > Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx> > --- > fs/dcache.c | 17 ++++++++++++++--- > 1 files changed, 14 insertions(+), 3 deletions(-) > > diff --git a/fs/dcache.c b/fs/dcache.c > index b05aac3..5e5208d 100644 > --- a/fs/dcache.c > +++ b/fs/dcache.c > @@ -116,6 +116,7 @@ struct dentry_stat_t dentry_stat = { > }; > > static DEFINE_PER_CPU(unsigned int, nr_dentry); > +static DEFINE_PER_CPU(unsigned int, nr_dentry_unused); > > #if defined(CONFIG_SYSCTL) && defined(CONFIG_PROC_FS) > static int get_nr_dentry(void) > @@ -127,10 +128,20 @@ static int get_nr_dentry(void) > return sum < 0 ? 0 : sum; > } > > +static int get_nr_dentry_unused(void) > +{ > + int i; > + int sum = 0; > + for_each_possible_cpu(i) > + sum += per_cpu(nr_dentry_unused, i); > + return sum < 0 ? 0 : sum; > +} Why not use struct percpu_counter and percpu_counter_sum_positive() for this? > + > int proc_nr_dentry(ctl_table *table, int write, void __user *buffer, > size_t *lenp, loff_t *ppos) > { > dentry_stat.nr_dentry = get_nr_dentry(); > + dentry_stat.nr_unused = get_nr_dentry_unused(); > return proc_dointvec(table, write, buffer, lenp, ppos); > } > #endif > @@ -233,7 +244,7 @@ static void dentry_lru_add(struct dentry *dentry) > spin_lock(&dcache_lru_lock); > list_add(&dentry->d_lru, &dentry->d_sb->s_dentry_lru); > dentry->d_sb->s_nr_dentry_unused++; > - dentry_stat.nr_unused++; > + this_cpu_inc(nr_dentry_unused); > spin_unlock(&dcache_lru_lock); > } > } > @@ -242,7 +253,7 @@ static void __dentry_lru_del(struct dentry *dentry) > { > list_del_init(&dentry->d_lru); > dentry->d_sb->s_nr_dentry_unused--; > - dentry_stat.nr_unused--; > + this_cpu_dec(nr_dentry_unused); > } > > static void dentry_lru_del(struct dentry *dentry) > @@ -260,7 +271,7 @@ static void dentry_lru_move_tail(struct dentry *dentry) > if (list_empty(&dentry->d_lru)) { > list_add_tail(&dentry->d_lru, &dentry->d_sb->s_dentry_lru); > dentry->d_sb->s_nr_dentry_unused++; > - dentry_stat.nr_unused++; > + this_cpu_inc(nr_dentry_unused); > } else { > list_move_tail(&dentry->d_lru, &dentry->d_sb->s_dentry_lru); > } > -- > 1.7.5.4 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ > -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html