diff options
Diffstat (limited to 'fs/mbcache.c')
-rw-r--r-- | fs/mbcache.c | 47 |
1 files changed, 26 insertions, 21 deletions
diff --git a/fs/mbcache.c b/fs/mbcache.c index 5eb04767cb29..e519e45bf673 100644 --- a/fs/mbcache.c +++ b/fs/mbcache.c | |||
@@ -86,18 +86,6 @@ static LIST_HEAD(mb_cache_list); | |||
86 | static LIST_HEAD(mb_cache_lru_list); | 86 | static LIST_HEAD(mb_cache_lru_list); |
87 | static DEFINE_SPINLOCK(mb_cache_spinlock); | 87 | static DEFINE_SPINLOCK(mb_cache_spinlock); |
88 | 88 | ||
89 | /* | ||
90 | * What the mbcache registers as to get shrunk dynamically. | ||
91 | */ | ||
92 | |||
93 | static int mb_cache_shrink_fn(struct shrinker *shrink, | ||
94 | struct shrink_control *sc); | ||
95 | |||
96 | static struct shrinker mb_cache_shrinker = { | ||
97 | .shrink = mb_cache_shrink_fn, | ||
98 | .seeks = DEFAULT_SEEKS, | ||
99 | }; | ||
100 | |||
101 | static inline int | 89 | static inline int |
102 | __mb_cache_entry_is_hashed(struct mb_cache_entry *ce) | 90 | __mb_cache_entry_is_hashed(struct mb_cache_entry *ce) |
103 | { | 91 | { |
@@ -151,7 +139,7 @@ forget: | |||
151 | 139 | ||
152 | 140 | ||
153 | /* | 141 | /* |
154 | * mb_cache_shrink_fn() memory pressure callback | 142 | * mb_cache_shrink_scan() memory pressure callback |
155 | * | 143 | * |
156 | * This function is called by the kernel memory management when memory | 144 | * This function is called by the kernel memory management when memory |
157 | * gets low. | 145 | * gets low. |
@@ -159,17 +147,16 @@ forget: | |||
159 | * @shrink: (ignored) | 147 | * @shrink: (ignored) |
160 | * @sc: shrink_control passed from reclaim | 148 | * @sc: shrink_control passed from reclaim |
161 | * | 149 | * |
162 | * Returns the number of objects which are present in the cache. | 150 | * Returns the number of objects freed. |
163 | */ | 151 | */ |
164 | static int | 152 | static unsigned long |
165 | mb_cache_shrink_fn(struct shrinker *shrink, struct shrink_control *sc) | 153 | mb_cache_shrink_scan(struct shrinker *shrink, struct shrink_control *sc) |
166 | { | 154 | { |
167 | LIST_HEAD(free_list); | 155 | LIST_HEAD(free_list); |
168 | struct mb_cache *cache; | ||
169 | struct mb_cache_entry *entry, *tmp; | 156 | struct mb_cache_entry *entry, *tmp; |
170 | int count = 0; | ||
171 | int nr_to_scan = sc->nr_to_scan; | 157 | int nr_to_scan = sc->nr_to_scan; |
172 | gfp_t gfp_mask = sc->gfp_mask; | 158 | gfp_t gfp_mask = sc->gfp_mask; |
159 | unsigned long freed = 0; | ||
173 | 160 | ||
174 | mb_debug("trying to free %d entries", nr_to_scan); | 161 | mb_debug("trying to free %d entries", nr_to_scan); |
175 | spin_lock(&mb_cache_spinlock); | 162 | spin_lock(&mb_cache_spinlock); |
@@ -179,19 +166,37 @@ mb_cache_shrink_fn(struct shrinker *shrink, struct shrink_control *sc) | |||
179 | struct mb_cache_entry, e_lru_list); | 166 | struct mb_cache_entry, e_lru_list); |
180 | list_move_tail(&ce->e_lru_list, &free_list); | 167 | list_move_tail(&ce->e_lru_list, &free_list); |
181 | __mb_cache_entry_unhash(ce); | 168 | __mb_cache_entry_unhash(ce); |
169 | freed++; | ||
170 | } | ||
171 | spin_unlock(&mb_cache_spinlock); | ||
172 | list_for_each_entry_safe(entry, tmp, &free_list, e_lru_list) { | ||
173 | __mb_cache_entry_forget(entry, gfp_mask); | ||
182 | } | 174 | } |
175 | return freed; | ||
176 | } | ||
177 | |||
178 | static unsigned long | ||
179 | mb_cache_shrink_count(struct shrinker *shrink, struct shrink_control *sc) | ||
180 | { | ||
181 | struct mb_cache *cache; | ||
182 | unsigned long count = 0; | ||
183 | |||
184 | spin_lock(&mb_cache_spinlock); | ||
183 | list_for_each_entry(cache, &mb_cache_list, c_cache_list) { | 185 | list_for_each_entry(cache, &mb_cache_list, c_cache_list) { |
184 | mb_debug("cache %s (%d)", cache->c_name, | 186 | mb_debug("cache %s (%d)", cache->c_name, |
185 | atomic_read(&cache->c_entry_count)); | 187 | atomic_read(&cache->c_entry_count)); |
186 | count += atomic_read(&cache->c_entry_count); | 188 | count += atomic_read(&cache->c_entry_count); |
187 | } | 189 | } |
188 | spin_unlock(&mb_cache_spinlock); | 190 | spin_unlock(&mb_cache_spinlock); |
189 | list_for_each_entry_safe(entry, tmp, &free_list, e_lru_list) { | 191 | |
190 | __mb_cache_entry_forget(entry, gfp_mask); | ||
191 | } | ||
192 | return vfs_pressure_ratio(count); | 192 | return vfs_pressure_ratio(count); |
193 | } | 193 | } |
194 | 194 | ||
195 | static struct shrinker mb_cache_shrinker = { | ||
196 | .count_objects = mb_cache_shrink_count, | ||
197 | .scan_objects = mb_cache_shrink_scan, | ||
198 | .seeks = DEFAULT_SEEKS, | ||
199 | }; | ||
195 | 200 | ||
196 | /* | 201 | /* |
197 | * mb_cache_create() create a new cache | 202 | * mb_cache_create() create a new cache |