Le vendredi 05 août 2011 à 04:35 +0400, Glauber Costa a écrit : > This patch lays the foundation for us to limit the dcache size. > Each super block can have only a maximum amount of dentries under its > sub-tree. Allocation fails if we we're over limit and the cache > can't be pruned to free up space for the newcomers. > > Signed-off-by: Glauber Costa <glommer@xxxxxxxxxxxxx> > CC: Dave Chinner <david@xxxxxxxxxxxxx> > --- > fs/dcache.c | 25 +++++++++++++++++++++++++ > fs/super.c | 1 + > include/linux/fs.h | 1 + > 3 files changed, 27 insertions(+), 0 deletions(-) > > diff --git a/fs/dcache.c b/fs/dcache.c > index ac19d24..52a0faf 100644 > --- a/fs/dcache.c > +++ b/fs/dcache.c > @@ -1180,6 +1180,28 @@ void shrink_dcache_parent(struct dentry * parent) > } > EXPORT_SYMBOL(shrink_dcache_parent); > > +static int dcache_mem_check(struct super_block *sb) > +{ > + int i; > + int nr_dentry; > + struct shrink_control sc = { > + .gfp_mask = GFP_KERNEL, > + }; > + > + do { > + nr_dentry = 0; > + for_each_possible_cpu(i) > + nr_dentry += per_cpu(*sb->s_nr_dentry, i); You seriously want to call this for every __d_alloc() invocation, even if s_nr_dentry_max is the default value (INT_MAX) ? On a 4096 cpu machine, it will be _very_ slow. A percpu_counter would be the thing to consider, since you can avoid the for_each_possible_cpu(i) loop if percpu_counter_read() is smaller than sb->s_nr_dentry_max. Check how its done in include/net/tcp.h, tcp_too_many_orphans() -- 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