diff options
Diffstat (limited to 'fs/dcache.c')
-rw-r--r-- | fs/dcache.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/fs/dcache.c b/fs/dcache.c index f62ba90bce91..b2cb2662ca00 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
@@ -67,13 +67,22 @@ struct dentry_stat_t dentry_stat = { | |||
67 | .age_limit = 45, | 67 | .age_limit = 45, |
68 | }; | 68 | }; |
69 | 69 | ||
70 | static struct percpu_counter nr_dentry __cacheline_aligned_in_smp; | 70 | static DEFINE_PER_CPU(unsigned int, nr_dentry); |
71 | 71 | ||
72 | #if defined(CONFIG_SYSCTL) && defined(CONFIG_PROC_FS) | 72 | #if defined(CONFIG_SYSCTL) && defined(CONFIG_PROC_FS) |
73 | static int get_nr_dentry(void) | ||
74 | { | ||
75 | int i; | ||
76 | int sum = 0; | ||
77 | for_each_possible_cpu(i) | ||
78 | sum += per_cpu(nr_dentry, i); | ||
79 | return sum < 0 ? 0 : sum; | ||
80 | } | ||
81 | |||
73 | int proc_nr_dentry(ctl_table *table, int write, void __user *buffer, | 82 | int proc_nr_dentry(ctl_table *table, int write, void __user *buffer, |
74 | size_t *lenp, loff_t *ppos) | 83 | size_t *lenp, loff_t *ppos) |
75 | { | 84 | { |
76 | dentry_stat.nr_dentry = percpu_counter_sum_positive(&nr_dentry); | 85 | dentry_stat.nr_dentry = get_nr_dentry(); |
77 | return proc_dointvec(table, write, buffer, lenp, ppos); | 86 | return proc_dointvec(table, write, buffer, lenp, ppos); |
78 | } | 87 | } |
79 | #endif | 88 | #endif |
@@ -93,7 +102,7 @@ static void __d_free(struct rcu_head *head) | |||
93 | */ | 102 | */ |
94 | static void d_free(struct dentry *dentry) | 103 | static void d_free(struct dentry *dentry) |
95 | { | 104 | { |
96 | percpu_counter_dec(&nr_dentry); | 105 | this_cpu_dec(nr_dentry); |
97 | if (dentry->d_op && dentry->d_op->d_release) | 106 | if (dentry->d_op && dentry->d_op->d_release) |
98 | dentry->d_op->d_release(dentry); | 107 | dentry->d_op->d_release(dentry); |
99 | 108 | ||
@@ -981,7 +990,7 @@ struct dentry *d_alloc(struct dentry * parent, const struct qstr *name) | |||
981 | list_add(&dentry->d_u.d_child, &parent->d_subdirs); | 990 | list_add(&dentry->d_u.d_child, &parent->d_subdirs); |
982 | spin_unlock(&dcache_lock); | 991 | spin_unlock(&dcache_lock); |
983 | 992 | ||
984 | percpu_counter_inc(&nr_dentry); | 993 | this_cpu_inc(nr_dentry); |
985 | 994 | ||
986 | return dentry; | 995 | return dentry; |
987 | } | 996 | } |
@@ -2418,8 +2427,6 @@ static void __init dcache_init(void) | |||
2418 | { | 2427 | { |
2419 | int loop; | 2428 | int loop; |
2420 | 2429 | ||
2421 | percpu_counter_init(&nr_dentry, 0); | ||
2422 | |||
2423 | /* | 2430 | /* |
2424 | * A constructor could be added for stable state like the lists, | 2431 | * A constructor could be added for stable state like the lists, |
2425 | * but it is probably not worth it because of the cache nature | 2432 | * but it is probably not worth it because of the cache nature |