diff options
author | Dave Chinner <dchinner@redhat.com> | 2013-08-27 20:18:16 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-09-10 18:56:32 -0400 |
commit | a0b02131c5fcd8545b867db72224b3659e813f10 (patch) | |
tree | 3ba5156965ca4625cd5a4ad78405180143eaf15c | |
parent | 70534a739c12b908789e27b08512d2615ba40f2f (diff) |
shrinker: Kill old ->shrink API.
There are no more users of this API, so kill it dead, dead, dead and
quietly bury the corpse in a shallow, unmarked grave in a dark forest deep
in the hills...
[glommer@openvz.org: added flowers to the grave]
Signed-off-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Glauber Costa <glommer@openvz.org>
Reviewed-by: Greg Thelen <gthelen@google.com>
Acked-by: Mel Gorman <mgorman@suse.de>
Cc: "Theodore Ts'o" <tytso@mit.edu>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Cc: Arve Hjønnevåg <arve@android.com>
Cc: Carlos Maiolino <cmaiolino@redhat.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Chuck Lever <chuck.lever@oracle.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: David Rientjes <rientjes@google.com>
Cc: Gleb Natapov <gleb@redhat.com>
Cc: Greg Thelen <gthelen@google.com>
Cc: J. Bruce Fields <bfields@redhat.com>
Cc: Jan Kara <jack@suse.cz>
Cc: Jerome Glisse <jglisse@redhat.com>
Cc: John Stultz <john.stultz@linaro.org>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Kent Overstreet <koverstreet@google.com>
Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Steven Whitehouse <swhiteho@redhat.com>
Cc: Thomas Hellstrom <thellstrom@vmware.com>
Cc: Trond Myklebust <Trond.Myklebust@netapp.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | include/linux/shrinker.h | 15 | ||||
-rw-r--r-- | include/trace/events/vmscan.h | 4 | ||||
-rw-r--r-- | mm/vmscan.c | 41 |
3 files changed, 15 insertions, 45 deletions
diff --git a/include/linux/shrinker.h b/include/linux/shrinker.h index 8f80f243fed9..68c097077ef0 100644 --- a/include/linux/shrinker.h +++ b/include/linux/shrinker.h | |||
@@ -7,14 +7,15 @@ | |||
7 | * | 7 | * |
8 | * The 'gfpmask' refers to the allocation we are currently trying to | 8 | * The 'gfpmask' refers to the allocation we are currently trying to |
9 | * fulfil. | 9 | * fulfil. |
10 | * | ||
11 | * Note that 'shrink' will be passed nr_to_scan == 0 when the VM is | ||
12 | * querying the cache size, so a fastpath for that case is appropriate. | ||
13 | */ | 10 | */ |
14 | struct shrink_control { | 11 | struct shrink_control { |
15 | gfp_t gfp_mask; | 12 | gfp_t gfp_mask; |
16 | 13 | ||
17 | /* How many slab objects shrinker() should scan and try to reclaim */ | 14 | /* |
15 | * How many objects scan_objects should scan and try to reclaim. | ||
16 | * This is reset before every call, so it is safe for callees | ||
17 | * to modify. | ||
18 | */ | ||
18 | unsigned long nr_to_scan; | 19 | unsigned long nr_to_scan; |
19 | 20 | ||
20 | /* shrink from these nodes */ | 21 | /* shrink from these nodes */ |
@@ -27,11 +28,6 @@ struct shrink_control { | |||
27 | /* | 28 | /* |
28 | * A callback you can register to apply pressure to ageable caches. | 29 | * A callback you can register to apply pressure to ageable caches. |
29 | * | 30 | * |
30 | * @shrink() should look through the least-recently-used 'nr_to_scan' entries | ||
31 | * and attempt to free them up. It should return the number of objects which | ||
32 | * remain in the cache. If it returns -1, it means it cannot do any scanning at | ||
33 | * this time (eg. there is a risk of deadlock). | ||
34 | * | ||
35 | * @count_objects should return the number of freeable items in the cache. If | 31 | * @count_objects should return the number of freeable items in the cache. If |
36 | * there are no objects to free or the number of freeable items cannot be | 32 | * there are no objects to free or the number of freeable items cannot be |
37 | * determined, it should return 0. No deadlock checks should be done during the | 33 | * determined, it should return 0. No deadlock checks should be done during the |
@@ -50,7 +46,6 @@ struct shrink_control { | |||
50 | * @flags determine the shrinker abilities, like numa awareness | 46 | * @flags determine the shrinker abilities, like numa awareness |
51 | */ | 47 | */ |
52 | struct shrinker { | 48 | struct shrinker { |
53 | int (*shrink)(struct shrinker *, struct shrink_control *sc); | ||
54 | unsigned long (*count_objects)(struct shrinker *, | 49 | unsigned long (*count_objects)(struct shrinker *, |
55 | struct shrink_control *sc); | 50 | struct shrink_control *sc); |
56 | unsigned long (*scan_objects)(struct shrinker *, | 51 | unsigned long (*scan_objects)(struct shrinker *, |
diff --git a/include/trace/events/vmscan.h b/include/trace/events/vmscan.h index 63cfcccaebb3..132a985aba8b 100644 --- a/include/trace/events/vmscan.h +++ b/include/trace/events/vmscan.h | |||
@@ -202,7 +202,7 @@ TRACE_EVENT(mm_shrink_slab_start, | |||
202 | 202 | ||
203 | TP_fast_assign( | 203 | TP_fast_assign( |
204 | __entry->shr = shr; | 204 | __entry->shr = shr; |
205 | __entry->shrink = shr->shrink; | 205 | __entry->shrink = shr->scan_objects; |
206 | __entry->nr_objects_to_shrink = nr_objects_to_shrink; | 206 | __entry->nr_objects_to_shrink = nr_objects_to_shrink; |
207 | __entry->gfp_flags = sc->gfp_mask; | 207 | __entry->gfp_flags = sc->gfp_mask; |
208 | __entry->pgs_scanned = pgs_scanned; | 208 | __entry->pgs_scanned = pgs_scanned; |
@@ -241,7 +241,7 @@ TRACE_EVENT(mm_shrink_slab_end, | |||
241 | 241 | ||
242 | TP_fast_assign( | 242 | TP_fast_assign( |
243 | __entry->shr = shr; | 243 | __entry->shr = shr; |
244 | __entry->shrink = shr->shrink; | 244 | __entry->shrink = shr->scan_objects; |
245 | __entry->unused_scan = unused_scan_cnt; | 245 | __entry->unused_scan = unused_scan_cnt; |
246 | __entry->new_scan = new_scan_cnt; | 246 | __entry->new_scan = new_scan_cnt; |
247 | __entry->retval = shrinker_retval; | 247 | __entry->retval = shrinker_retval; |
diff --git a/mm/vmscan.c b/mm/vmscan.c index 799ebceeb4f7..e36454220614 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -194,14 +194,6 @@ void unregister_shrinker(struct shrinker *shrinker) | |||
194 | } | 194 | } |
195 | EXPORT_SYMBOL(unregister_shrinker); | 195 | EXPORT_SYMBOL(unregister_shrinker); |
196 | 196 | ||
197 | static inline int do_shrinker_shrink(struct shrinker *shrinker, | ||
198 | struct shrink_control *sc, | ||
199 | unsigned long nr_to_scan) | ||
200 | { | ||
201 | sc->nr_to_scan = nr_to_scan; | ||
202 | return (*shrinker->shrink)(shrinker, sc); | ||
203 | } | ||
204 | |||
205 | #define SHRINK_BATCH 128 | 197 | #define SHRINK_BATCH 128 |
206 | 198 | ||
207 | static unsigned long | 199 | static unsigned long |
@@ -218,10 +210,7 @@ shrink_slab_node(struct shrink_control *shrinkctl, struct shrinker *shrinker, | |||
218 | long batch_size = shrinker->batch ? shrinker->batch | 210 | long batch_size = shrinker->batch ? shrinker->batch |
219 | : SHRINK_BATCH; | 211 | : SHRINK_BATCH; |
220 | 212 | ||
221 | if (shrinker->count_objects) | 213 | max_pass = shrinker->count_objects(shrinker, shrinkctl); |
222 | max_pass = shrinker->count_objects(shrinker, shrinkctl); | ||
223 | else | ||
224 | max_pass = do_shrinker_shrink(shrinker, shrinkctl, 0); | ||
225 | if (max_pass == 0) | 214 | if (max_pass == 0) |
226 | return 0; | 215 | return 0; |
227 | 216 | ||
@@ -240,7 +229,7 @@ shrink_slab_node(struct shrink_control *shrinkctl, struct shrinker *shrinker, | |||
240 | if (total_scan < 0) { | 229 | if (total_scan < 0) { |
241 | printk(KERN_ERR | 230 | printk(KERN_ERR |
242 | "shrink_slab: %pF negative objects to delete nr=%ld\n", | 231 | "shrink_slab: %pF negative objects to delete nr=%ld\n", |
243 | shrinker->shrink, total_scan); | 232 | shrinker->scan_objects, total_scan); |
244 | total_scan = max_pass; | 233 | total_scan = max_pass; |
245 | } | 234 | } |
246 | 235 | ||
@@ -272,27 +261,13 @@ shrink_slab_node(struct shrink_control *shrinkctl, struct shrinker *shrinker, | |||
272 | max_pass, delta, total_scan); | 261 | max_pass, delta, total_scan); |
273 | 262 | ||
274 | while (total_scan >= batch_size) { | 263 | while (total_scan >= batch_size) { |
264 | unsigned long ret; | ||
275 | 265 | ||
276 | if (shrinker->scan_objects) { | 266 | shrinkctl->nr_to_scan = batch_size; |
277 | unsigned long ret; | 267 | ret = shrinker->scan_objects(shrinker, shrinkctl); |
278 | shrinkctl->nr_to_scan = batch_size; | 268 | if (ret == SHRINK_STOP) |
279 | ret = shrinker->scan_objects(shrinker, shrinkctl); | 269 | break; |
280 | 270 | freed += ret; | |
281 | if (ret == SHRINK_STOP) | ||
282 | break; | ||
283 | freed += ret; | ||
284 | } else { | ||
285 | int nr_before; | ||
286 | long ret; | ||
287 | |||
288 | nr_before = do_shrinker_shrink(shrinker, shrinkctl, 0); | ||
289 | ret = do_shrinker_shrink(shrinker, shrinkctl, | ||
290 | batch_size); | ||
291 | if (ret == -1) | ||
292 | break; | ||
293 | if (ret < nr_before) | ||
294 | freed += nr_before - ret; | ||
295 | } | ||
296 | 271 | ||
297 | count_vm_events(SLABS_SCANNED, batch_size); | 272 | count_vm_events(SLABS_SCANNED, batch_size); |
298 | total_scan -= batch_size; | 273 | total_scan -= batch_size; |