|
@@ -112,9 +112,14 @@ static unsigned long super_cache_count(struct shrinker *shrink,
|
|
|
|
|
|
sb = container_of(shrink, struct super_block, s_shrink);
|
|
|
|
|
|
- if (!grab_super_passive(sb))
|
|
|
- return 0;
|
|
|
-
|
|
|
+ /*
|
|
|
+ * Don't call grab_super_passive as it is a potential
|
|
|
+ * scalability bottleneck. The counts could get updated
|
|
|
+ * between super_cache_count and super_cache_scan anyway.
|
|
|
+ * Call to super_cache_count with shrinker_rwsem held
|
|
|
+ * ensures the safety of call to list_lru_count_node() and
|
|
|
+ * s_op->nr_cached_objects().
|
|
|
+ */
|
|
|
if (sb->s_op && sb->s_op->nr_cached_objects)
|
|
|
total_objects = sb->s_op->nr_cached_objects(sb,
|
|
|
sc->nid);
|
|
@@ -125,7 +130,6 @@ static unsigned long super_cache_count(struct shrinker *shrink,
|
|
|
sc->nid);
|
|
|
|
|
|
total_objects = vfs_pressure_ratio(total_objects);
|
|
|
- drop_super(sb);
|
|
|
return total_objects;
|
|
|
}
|
|
|
|