aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Chinner <dchinner@redhat.com>2013-08-27 20:18:11 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2013-09-10 18:56:32 -0400
commit7dc19d5affd71370754a2c3d36b485810eaee7a1 (patch)
tree56b84fb2f7462e81c8340dea6341c30ce247f798
parent1ab6c4997e04a00c50c6d786c2f046adc0d1f5de (diff)
drivers: convert shrinkers to new count/scan API
Convert the driver shrinkers to the new API. Most changes are compile tested only because I either don't have the hardware or it's staging stuff. FWIW, the md and android code is pretty good, but the rest of it makes me want to claw my eyes out. The amount of broken code I just encountered is mind boggling. I've added comments explaining what is broken, but I fear that some of the code would be best dealt with by being dragged behind the bike shed, burying in mud up to it's neck and then run over repeatedly with a blunt lawn mower. Special mention goes to the zcache/zcache2 drivers. They can't co-exist in the build at the same time, they are under different menu options in menuconfig, they only show up when you've got the right set of mm subsystem options configured and so even compile testing is an exercise in pulling teeth. And that doesn't even take into account the horrible, broken code... [glommer@openvz.org: fixes for i915, android lowmem, zcache, bcache] Signed-off-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Glauber Costa <glommer@openvz.org> Acked-by: Mel Gorman <mgorman@suse.de> Cc: Daniel Vetter <daniel.vetter@ffwll.ch> Cc: Kent Overstreet <koverstreet@google.com> Cc: John Stultz <john.stultz@linaro.org> Cc: David Rientjes <rientjes@google.com> Cc: Jerome Glisse <jglisse@redhat.com> Cc: Thomas Hellstrom <thellstrom@vmware.com> 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--drivers/gpu/drm/i915/i915_dma.c4
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c78
-rw-r--r--drivers/gpu/drm/ttm/ttm_page_alloc.c44
-rw-r--r--drivers/gpu/drm/ttm/ttm_page_alloc_dma.c51
-rw-r--r--drivers/md/bcache/btree.c43
-rw-r--r--drivers/md/bcache/sysfs.c2
-rw-r--r--drivers/md/dm-bufio.c64
-rw-r--r--drivers/staging/android/ashmem.c43
-rw-r--r--drivers/staging/android/lowmemorykiller.c43
9 files changed, 236 insertions, 136 deletions
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index fdaa0915ce56..d5c784d48671 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -1667,7 +1667,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
1667 return 0; 1667 return 0;
1668 1668
1669out_gem_unload: 1669out_gem_unload:
1670 if (dev_priv->mm.inactive_shrinker.shrink) 1670 if (dev_priv->mm.inactive_shrinker.scan_objects)
1671 unregister_shrinker(&dev_priv->mm.inactive_shrinker); 1671 unregister_shrinker(&dev_priv->mm.inactive_shrinker);
1672 1672
1673 if (dev->pdev->msi_enabled) 1673 if (dev->pdev->msi_enabled)
@@ -1706,7 +1706,7 @@ int i915_driver_unload(struct drm_device *dev)
1706 1706
1707 i915_teardown_sysfs(dev); 1707 i915_teardown_sysfs(dev);
1708 1708
1709 if (dev_priv->mm.inactive_shrinker.shrink) 1709 if (dev_priv->mm.inactive_shrinker.scan_objects)
1710 unregister_shrinker(&dev_priv->mm.inactive_shrinker); 1710 unregister_shrinker(&dev_priv->mm.inactive_shrinker);
1711 1711
1712 mutex_lock(&dev->struct_mutex); 1712 mutex_lock(&dev->struct_mutex);
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 2d1cb10d846f..39301b990ba2 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -57,10 +57,12 @@ static void i915_gem_object_update_fence(struct drm_i915_gem_object *obj,
57 struct drm_i915_fence_reg *fence, 57 struct drm_i915_fence_reg *fence,
58 bool enable); 58 bool enable);
59 59
60static int i915_gem_inactive_shrink(struct shrinker *shrinker, 60static unsigned long i915_gem_inactive_count(struct shrinker *shrinker,
61 struct shrink_control *sc); 61 struct shrink_control *sc);
62static unsigned long i915_gem_inactive_scan(struct shrinker *shrinker,
63 struct shrink_control *sc);
62static long i915_gem_purge(struct drm_i915_private *dev_priv, long target); 64static long i915_gem_purge(struct drm_i915_private *dev_priv, long target);
63static void i915_gem_shrink_all(struct drm_i915_private *dev_priv); 65static long i915_gem_shrink_all(struct drm_i915_private *dev_priv);
64static void i915_gem_object_truncate(struct drm_i915_gem_object *obj); 66static void i915_gem_object_truncate(struct drm_i915_gem_object *obj);
65 67
66static bool cpu_cache_is_coherent(struct drm_device *dev, 68static bool cpu_cache_is_coherent(struct drm_device *dev,
@@ -1736,16 +1738,21 @@ i915_gem_purge(struct drm_i915_private *dev_priv, long target)
1736 return __i915_gem_shrink(dev_priv, target, true); 1738 return __i915_gem_shrink(dev_priv, target, true);
1737} 1739}
1738 1740
1739static void 1741static long
1740i915_gem_shrink_all(struct drm_i915_private *dev_priv) 1742i915_gem_shrink_all(struct drm_i915_private *dev_priv)
1741{ 1743{
1742 struct drm_i915_gem_object *obj, *next; 1744 struct drm_i915_gem_object *obj, *next;
1745 long freed = 0;
1743 1746
1744 i915_gem_evict_everything(dev_priv->dev); 1747 i915_gem_evict_everything(dev_priv->dev);
1745 1748
1746 list_for_each_entry_safe(obj, next, &dev_priv->mm.unbound_list, 1749 list_for_each_entry_safe(obj, next, &dev_priv->mm.unbound_list,
1747 global_list) 1750 global_list) {
1751 if (obj->pages_pin_count == 0)
1752 freed += obj->base.size >> PAGE_SHIFT;
1748 i915_gem_object_put_pages(obj); 1753 i915_gem_object_put_pages(obj);
1754 }
1755 return freed;
1749} 1756}
1750 1757
1751static int 1758static int
@@ -4526,7 +4533,8 @@ i915_gem_load(struct drm_device *dev)
4526 4533
4527 dev_priv->mm.interruptible = true; 4534 dev_priv->mm.interruptible = true;
4528 4535
4529 dev_priv->mm.inactive_shrinker.shrink = i915_gem_inactive_shrink; 4536 dev_priv->mm.inactive_shrinker.scan_objects = i915_gem_inactive_scan;
4537 dev_priv->mm.inactive_shrinker.count_objects = i915_gem_inactive_count;
4530 dev_priv->mm.inactive_shrinker.seeks = DEFAULT_SEEKS; 4538 dev_priv->mm.inactive_shrinker.seeks = DEFAULT_SEEKS;
4531 register_shrinker(&dev_priv->mm.inactive_shrinker); 4539 register_shrinker(&dev_priv->mm.inactive_shrinker);
4532} 4540}
@@ -4749,8 +4757,8 @@ static bool mutex_is_locked_by(struct mutex *mutex, struct task_struct *task)
4749#endif 4757#endif
4750} 4758}
4751 4759
4752static int 4760static unsigned long
4753i915_gem_inactive_shrink(struct shrinker *shrinker, struct shrink_control *sc) 4761i915_gem_inactive_count(struct shrinker *shrinker, struct shrink_control *sc)
4754{ 4762{
4755 struct drm_i915_private *dev_priv = 4763 struct drm_i915_private *dev_priv =
4756 container_of(shrinker, 4764 container_of(shrinker,
@@ -4758,9 +4766,8 @@ i915_gem_inactive_shrink(struct shrinker *shrinker, struct shrink_control *sc)
4758 mm.inactive_shrinker); 4766 mm.inactive_shrinker);
4759 struct drm_device *dev = dev_priv->dev; 4767 struct drm_device *dev = dev_priv->dev;
4760 struct drm_i915_gem_object *obj; 4768 struct drm_i915_gem_object *obj;
4761 int nr_to_scan = sc->nr_to_scan;
4762 bool unlock = true; 4769 bool unlock = true;
4763 int cnt; 4770 unsigned long count;
4764 4771
4765 if (!mutex_trylock(&dev->struct_mutex)) { 4772 if (!mutex_trylock(&dev->struct_mutex)) {
4766 if (!mutex_is_locked_by(&dev->struct_mutex, current)) 4773 if (!mutex_is_locked_by(&dev->struct_mutex, current))
@@ -4772,31 +4779,22 @@ i915_gem_inactive_shrink(struct shrinker *shrinker, struct shrink_control *sc)
4772 unlock = false; 4779 unlock = false;
4773 } 4780 }
4774 4781
4775 if (nr_to_scan) { 4782 count = 0;
4776 nr_to_scan -= i915_gem_purge(dev_priv, nr_to_scan);
4777 if (nr_to_scan > 0)
4778 nr_to_scan -= __i915_gem_shrink(dev_priv, nr_to_scan,
4779 false);
4780 if (nr_to_scan > 0)
4781 i915_gem_shrink_all(dev_priv);
4782 }
4783
4784 cnt = 0;
4785 list_for_each_entry(obj, &dev_priv->mm.unbound_list, global_list) 4783 list_for_each_entry(obj, &dev_priv->mm.unbound_list, global_list)
4786 if (obj->pages_pin_count == 0) 4784 if (obj->pages_pin_count == 0)
4787 cnt += obj->base.size >> PAGE_SHIFT; 4785 count += obj->base.size >> PAGE_SHIFT;
4788 4786
4789 list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) { 4787 list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) {
4790 if (obj->active) 4788 if (obj->active)
4791 continue; 4789 continue;
4792 4790
4793 if (obj->pin_count == 0 && obj->pages_pin_count == 0) 4791 if (obj->pin_count == 0 && obj->pages_pin_count == 0)
4794 cnt += obj->base.size >> PAGE_SHIFT; 4792 count += obj->base.size >> PAGE_SHIFT;
4795 } 4793 }
4796 4794
4797 if (unlock) 4795 if (unlock)
4798 mutex_unlock(&dev->struct_mutex); 4796 mutex_unlock(&dev->struct_mutex);
4799 return cnt; 4797 return count;
4800} 4798}
4801 4799
4802/* All the new VM stuff */ 4800/* All the new VM stuff */
@@ -4860,6 +4858,40 @@ unsigned long i915_gem_obj_size(struct drm_i915_gem_object *o,
4860 return 0; 4858 return 0;
4861} 4859}
4862 4860
4861static unsigned long
4862i915_gem_inactive_scan(struct shrinker *shrinker, struct shrink_control *sc)
4863{
4864 struct drm_i915_private *dev_priv =
4865 container_of(shrinker,
4866 struct drm_i915_private,
4867 mm.inactive_shrinker);
4868 struct drm_device *dev = dev_priv->dev;
4869 int nr_to_scan = sc->nr_to_scan;
4870 unsigned long freed;
4871 bool unlock = true;
4872
4873 if (!mutex_trylock(&dev->struct_mutex)) {
4874 if (!mutex_is_locked_by(&dev->struct_mutex, current))
4875 return 0;
4876
4877 if (dev_priv->mm.shrinker_no_lock_stealing)
4878 return 0;
4879
4880 unlock = false;
4881 }
4882
4883 freed = i915_gem_purge(dev_priv, nr_to_scan);
4884 if (freed < nr_to_scan)
4885 freed += __i915_gem_shrink(dev_priv, nr_to_scan,
4886 false);
4887 if (freed < nr_to_scan)
4888 freed += i915_gem_shrink_all(dev_priv);
4889
4890 if (unlock)
4891 mutex_unlock(&dev->struct_mutex);
4892 return freed;
4893}
4894
4863struct i915_vma *i915_gem_obj_to_vma(struct drm_i915_gem_object *obj, 4895struct i915_vma *i915_gem_obj_to_vma(struct drm_i915_gem_object *obj,
4864 struct i915_address_space *vm) 4896 struct i915_address_space *vm)
4865{ 4897{
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c
index bd2a3b40cd12..863bef9f9234 100644
--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
@@ -377,28 +377,26 @@ out:
377 return nr_free; 377 return nr_free;
378} 378}
379 379
380/* Get good estimation how many pages are free in pools */
381static int ttm_pool_get_num_unused_pages(void)
382{
383 unsigned i;
384 int total = 0;
385 for (i = 0; i < NUM_POOLS; ++i)
386 total += _manager->pools[i].npages;
387
388 return total;
389}
390
391/** 380/**
392 * Callback for mm to request pool to reduce number of page held. 381 * Callback for mm to request pool to reduce number of page held.
382 *
383 * XXX: (dchinner) Deadlock warning!
384 *
385 * ttm_page_pool_free() does memory allocation using GFP_KERNEL. that means
386 * this can deadlock when called a sc->gfp_mask that is not equal to
387 * GFP_KERNEL.
388 *
389 * This code is crying out for a shrinker per pool....
393 */ 390 */
394static int ttm_pool_mm_shrink(struct shrinker *shrink, 391static unsigned long
395 struct shrink_control *sc) 392ttm_pool_shrink_scan(struct shrinker *shrink, struct shrink_control *sc)
396{ 393{
397 static atomic_t start_pool = ATOMIC_INIT(0); 394 static atomic_t start_pool = ATOMIC_INIT(0);
398 unsigned i; 395 unsigned i;
399 unsigned pool_offset = atomic_add_return(1, &start_pool); 396 unsigned pool_offset = atomic_add_return(1, &start_pool);
400 struct ttm_page_pool *pool; 397 struct ttm_page_pool *pool;
401 int shrink_pages = sc->nr_to_scan; 398 int shrink_pages = sc->nr_to_scan;
399 unsigned long freed = 0;
402 400
403 pool_offset = pool_offset % NUM_POOLS; 401 pool_offset = pool_offset % NUM_POOLS;
404 /* select start pool in round robin fashion */ 402 /* select start pool in round robin fashion */
@@ -408,14 +406,28 @@ static int ttm_pool_mm_shrink(struct shrinker *shrink,
408 break; 406 break;
409 pool = &_manager->pools[(i + pool_offset)%NUM_POOLS]; 407 pool = &_manager->pools[(i + pool_offset)%NUM_POOLS];
410 shrink_pages = ttm_page_pool_free(pool, nr_free); 408 shrink_pages = ttm_page_pool_free(pool, nr_free);
409 freed += nr_free - shrink_pages;
411 } 410 }
412 /* return estimated number of unused pages in pool */ 411 return freed;
413 return ttm_pool_get_num_unused_pages(); 412}
413
414
415static unsigned long
416ttm_pool_shrink_count(struct shrinker *shrink, struct shrink_control *sc)
417{
418 unsigned i;
419 unsigned long count = 0;
420
421 for (i = 0; i < NUM_POOLS; ++i)
422 count += _manager->pools[i].npages;
423
424 return count;
414} 425}
415 426
416static void ttm_pool_mm_shrink_init(struct ttm_pool_manager *manager) 427static void ttm_pool_mm_shrink_init(struct ttm_pool_manager *manager)
417{ 428{
418 manager->mm_shrink.shrink = &ttm_pool_mm_shrink; 429 manager->mm_shrink.count_objects = ttm_pool_shrink_count;
430 manager->mm_shrink.scan_objects = ttm_pool_shrink_scan;
419 manager->mm_shrink.seeks = 1; 431 manager->mm_shrink.seeks = 1;
420 register_shrinker(&manager->mm_shrink); 432 register_shrinker(&manager->mm_shrink);
421} 433}
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
index b8b394319b45..7957beeeaf73 100644
--- a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
@@ -918,19 +918,6 @@ int ttm_dma_populate(struct ttm_dma_tt *ttm_dma, struct device *dev)
918} 918}
919EXPORT_SYMBOL_GPL(ttm_dma_populate); 919EXPORT_SYMBOL_GPL(ttm_dma_populate);
920 920
921/* Get good estimation how many pages are free in pools */
922static int ttm_dma_pool_get_num_unused_pages(void)
923{
924 struct device_pools *p;
925 unsigned total = 0;
926
927 mutex_lock(&_manager->lock);
928 list_for_each_entry(p, &_manager->pools, pools)
929 total += p->pool->npages_free;
930 mutex_unlock(&_manager->lock);
931 return total;
932}
933
934/* Put all pages in pages list to correct pool to wait for reuse */ 921/* Put all pages in pages list to correct pool to wait for reuse */
935void ttm_dma_unpopulate(struct ttm_dma_tt *ttm_dma, struct device *dev) 922void ttm_dma_unpopulate(struct ttm_dma_tt *ttm_dma, struct device *dev)
936{ 923{
@@ -1002,18 +989,29 @@ EXPORT_SYMBOL_GPL(ttm_dma_unpopulate);
1002 989
1003/** 990/**
1004 * Callback for mm to request pool to reduce number of page held. 991 * Callback for mm to request pool to reduce number of page held.
992 *
993 * XXX: (dchinner) Deadlock warning!
994 *
995 * ttm_dma_page_pool_free() does GFP_KERNEL memory allocation, and so attention
996 * needs to be paid to sc->gfp_mask to determine if this can be done or not.
997 * GFP_KERNEL memory allocation in a GFP_ATOMIC reclaim context woul dbe really
998 * bad.
999 *
1000 * I'm getting sadder as I hear more pathetical whimpers about needing per-pool
1001 * shrinkers
1005 */ 1002 */
1006static int ttm_dma_pool_mm_shrink(struct shrinker *shrink, 1003static unsigned long
1007 struct shrink_control *sc) 1004ttm_dma_pool_shrink_scan(struct shrinker *shrink, struct shrink_control *sc)
1008{ 1005{
1009 static atomic_t start_pool = ATOMIC_INIT(0); 1006 static atomic_t start_pool = ATOMIC_INIT(0);
1010 unsigned idx = 0; 1007 unsigned idx = 0;
1011 unsigned pool_offset = atomic_add_return(1, &start_pool); 1008 unsigned pool_offset = atomic_add_return(1, &start_pool);
1012 unsigned shrink_pages = sc->nr_to_scan; 1009 unsigned shrink_pages = sc->nr_to_scan;
1013 struct device_pools *p; 1010 struct device_pools *p;
1011 unsigned long freed = 0;
1014 1012
1015 if (list_empty(&_manager->pools)) 1013 if (list_empty(&_manager->pools))
1016 return 0; 1014 return SHRINK_STOP;
1017 1015
1018 mutex_lock(&_manager->lock); 1016 mutex_lock(&_manager->lock);
1019 pool_offset = pool_offset % _manager->npools; 1017 pool_offset = pool_offset % _manager->npools;
@@ -1029,18 +1027,33 @@ static int ttm_dma_pool_mm_shrink(struct shrinker *shrink,
1029 continue; 1027 continue;
1030 nr_free = shrink_pages; 1028 nr_free = shrink_pages;
1031 shrink_pages = ttm_dma_page_pool_free(p->pool, nr_free); 1029 shrink_pages = ttm_dma_page_pool_free(p->pool, nr_free);
1030 freed += nr_free - shrink_pages;
1031
1032 pr_debug("%s: (%s:%d) Asked to shrink %d, have %d more to go\n", 1032 pr_debug("%s: (%s:%d) Asked to shrink %d, have %d more to go\n",
1033 p->pool->dev_name, p->pool->name, current->pid, 1033 p->pool->dev_name, p->pool->name, current->pid,
1034 nr_free, shrink_pages); 1034 nr_free, shrink_pages);
1035 } 1035 }
1036 mutex_unlock(&_manager->lock); 1036 mutex_unlock(&_manager->lock);
1037 /* return estimated number of unused pages in pool */ 1037 return freed;
1038 return ttm_dma_pool_get_num_unused_pages(); 1038}
1039
1040static unsigned long
1041ttm_dma_pool_shrink_count(struct shrinker *shrink, struct shrink_control *sc)
1042{
1043 struct device_pools *p;
1044 unsigned long count = 0;
1045
1046 mutex_lock(&_manager->lock);
1047 list_for_each_entry(p, &_manager->pools, pools)
1048 count += p->pool->npages_free;
1049 mutex_unlock(&_manager->lock);
1050 return count;
1039} 1051}
1040 1052
1041static void ttm_dma_pool_mm_shrink_init(struct ttm_pool_manager *manager) 1053static void ttm_dma_pool_mm_shrink_init(struct ttm_pool_manager *manager)
1042{ 1054{
1043 manager->mm_shrink.shrink = &ttm_dma_pool_mm_shrink; 1055 manager->mm_shrink.count_objects = ttm_dma_pool_shrink_count;
1056 manager->mm_shrink.scan_objects = &ttm_dma_pool_shrink_scan;
1044 manager->mm_shrink.seeks = 1; 1057 manager->mm_shrink.seeks = 1;
1045 register_shrinker(&manager->mm_shrink); 1058 register_shrinker(&manager->mm_shrink);
1046} 1059}
diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c
index ee372884c405..f9764e61978b 100644
--- a/drivers/md/bcache/btree.c
+++ b/drivers/md/bcache/btree.c
@@ -597,24 +597,19 @@ static int mca_reap(struct btree *b, struct closure *cl, unsigned min_order)
597 return 0; 597 return 0;
598} 598}
599 599
600static int bch_mca_shrink(struct shrinker *shrink, struct shrink_control *sc) 600static unsigned long bch_mca_scan(struct shrinker *shrink,
601 struct shrink_control *sc)
601{ 602{
602 struct cache_set *c = container_of(shrink, struct cache_set, shrink); 603 struct cache_set *c = container_of(shrink, struct cache_set, shrink);
603 struct btree *b, *t; 604 struct btree *b, *t;
604 unsigned long i, nr = sc->nr_to_scan; 605 unsigned long i, nr = sc->nr_to_scan;
606 unsigned long freed = 0;
605 607
606 if (c->shrinker_disabled) 608 if (c->shrinker_disabled)
607 return 0; 609 return SHRINK_STOP;
608 610
609 if (c->try_harder) 611 if (c->try_harder)
610 return 0; 612 return SHRINK_STOP;
611
612 /*
613 * If nr == 0, we're supposed to return the number of items we have
614 * cached. Not allowed to return -1.
615 */
616 if (!nr)
617 return mca_can_free(c) * c->btree_pages;
618 613
619 /* Return -1 if we can't do anything right now */ 614 /* Return -1 if we can't do anything right now */
620 if (sc->gfp_mask & __GFP_WAIT) 615 if (sc->gfp_mask & __GFP_WAIT)
@@ -634,14 +629,14 @@ static int bch_mca_shrink(struct shrinker *shrink, struct shrink_control *sc)
634 629
635 i = 0; 630 i = 0;
636 list_for_each_entry_safe(b, t, &c->btree_cache_freeable, list) { 631 list_for_each_entry_safe(b, t, &c->btree_cache_freeable, list) {
637 if (!nr) 632 if (freed >= nr)
638 break; 633 break;
639 634
640 if (++i > 3 && 635 if (++i > 3 &&
641 !mca_reap(b, NULL, 0)) { 636 !mca_reap(b, NULL, 0)) {
642 mca_data_free(b); 637 mca_data_free(b);
643 rw_unlock(true, b); 638 rw_unlock(true, b);
644 --nr; 639 freed++;
645 } 640 }
646 } 641 }
647 642
@@ -652,7 +647,7 @@ static int bch_mca_shrink(struct shrinker *shrink, struct shrink_control *sc)
652 if (list_empty(&c->btree_cache)) 647 if (list_empty(&c->btree_cache))
653 goto out; 648 goto out;
654 649
655 for (i = 0; nr && i < c->bucket_cache_used; i++) { 650 for (i = 0; (nr--) && i < c->bucket_cache_used; i++) {
656 b = list_first_entry(&c->btree_cache, struct btree, list); 651 b = list_first_entry(&c->btree_cache, struct btree, list);
657 list_rotate_left(&c->btree_cache); 652 list_rotate_left(&c->btree_cache);
658 653
@@ -661,14 +656,27 @@ static int bch_mca_shrink(struct shrinker *shrink, struct shrink_control *sc)
661 mca_bucket_free(b); 656 mca_bucket_free(b);
662 mca_data_free(b); 657 mca_data_free(b);
663 rw_unlock(true, b); 658 rw_unlock(true, b);
664 --nr; 659 freed++;
665 } else 660 } else
666 b->accessed = 0; 661 b->accessed = 0;
667 } 662 }
668out: 663out:
669 nr = mca_can_free(c) * c->btree_pages;
670 mutex_unlock(&c->bucket_lock); 664 mutex_unlock(&c->bucket_lock);
671 return nr; 665 return freed;
666}
667
668static unsigned long bch_mca_count(struct shrinker *shrink,
669 struct shrink_control *sc)
670{
671 struct cache_set *c = container_of(shrink, struct cache_set, shrink);
672
673 if (c->shrinker_disabled)
674 return 0;
675
676 if (c->try_harder)
677 return 0;
678
679 return mca_can_free(c) * c->btree_pages;
672} 680}
673 681
674void bch_btree_cache_free(struct cache_set *c) 682void bch_btree_cache_free(struct cache_set *c)
@@ -737,7 +745,8 @@ int bch_btree_cache_alloc(struct cache_set *c)
737 c->verify_data = NULL; 745 c->verify_data = NULL;
738#endif 746#endif
739 747
740 c->shrink.shrink = bch_mca_shrink; 748 c->shrink.count_objects = bch_mca_count;
749 c->shrink.scan_objects = bch_mca_scan;
741 c->shrink.seeks = 4; 750 c->shrink.seeks = 4;
742 c->shrink.batch = c->btree_pages * 2; 751 c->shrink.batch = c->btree_pages * 2;
743 register_shrinker(&c->shrink); 752 register_shrinker(&c->shrink);
diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c
index 12a2c2846f99..4fe6ab2fbe2e 100644
--- a/drivers/md/bcache/sysfs.c
+++ b/drivers/md/bcache/sysfs.c
@@ -556,7 +556,7 @@ STORE(__bch_cache_set)
556 struct shrink_control sc; 556 struct shrink_control sc;
557 sc.gfp_mask = GFP_KERNEL; 557 sc.gfp_mask = GFP_KERNEL;
558 sc.nr_to_scan = strtoul_or_return(buf); 558 sc.nr_to_scan = strtoul_or_return(buf);
559 c->shrink.shrink(&c->shrink, &sc); 559 c->shrink.scan_objects(&c->shrink, &sc);
560 } 560 }
561 561
562 sysfs_strtoul(congested_read_threshold_us, 562 sysfs_strtoul(congested_read_threshold_us,
diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c
index 5227e079a6e3..173cbb20d104 100644
--- a/drivers/md/dm-bufio.c
+++ b/drivers/md/dm-bufio.c
@@ -1425,62 +1425,75 @@ static int __cleanup_old_buffer(struct dm_buffer *b, gfp_t gfp,
1425 unsigned long max_jiffies) 1425 unsigned long max_jiffies)
1426{ 1426{
1427 if (jiffies - b->last_accessed < max_jiffies) 1427 if (jiffies - b->last_accessed < max_jiffies)
1428 return 1; 1428 return 0;
1429 1429
1430 if (!(gfp & __GFP_IO)) { 1430 if (!(gfp & __GFP_IO)) {
1431 if (test_bit(B_READING, &b->state) || 1431 if (test_bit(B_READING, &b->state) ||
1432 test_bit(B_WRITING, &b->state) || 1432 test_bit(B_WRITING, &b->state) ||
1433 test_bit(B_DIRTY, &b->state)) 1433 test_bit(B_DIRTY, &b->state))
1434 return 1; 1434 return 0;
1435 } 1435 }
1436 1436
1437 if (b->hold_count) 1437 if (b->hold_count)
1438 return 1; 1438 return 0;
1439 1439
1440 __make_buffer_clean(b); 1440 __make_buffer_clean(b);
1441 __unlink_buffer(b); 1441 __unlink_buffer(b);
1442 __free_buffer_wake(b); 1442 __free_buffer_wake(b);
1443 1443
1444 return 0; 1444 return 1;
1445} 1445}
1446 1446
1447static void __scan(struct dm_bufio_client *c, unsigned long nr_to_scan, 1447static long __scan(struct dm_bufio_client *c, unsigned long nr_to_scan,
1448 struct shrink_control *sc) 1448 gfp_t gfp_mask)
1449{ 1449{
1450 int l; 1450 int l;
1451 struct dm_buffer *b, *tmp; 1451 struct dm_buffer *b, *tmp;
1452 long freed = 0;
1452 1453
1453 for (l = 0; l < LIST_SIZE; l++) { 1454 for (l = 0; l < LIST_SIZE; l++) {
1454 list_for_each_entry_safe_reverse(b, tmp, &c->lru[l], lru_list) 1455 list_for_each_entry_safe_reverse(b, tmp, &c->lru[l], lru_list) {
1455 if (!__cleanup_old_buffer(b, sc->gfp_mask, 0) && 1456 freed += __cleanup_old_buffer(b, gfp_mask, 0);
1456 !--nr_to_scan) 1457 if (!--nr_to_scan)
1457 return; 1458 break;
1459 }
1458 dm_bufio_cond_resched(); 1460 dm_bufio_cond_resched();
1459 } 1461 }
1462 return freed;
1460} 1463}
1461 1464
1462static int shrink(struct shrinker *shrinker, struct shrink_control *sc) 1465static unsigned long
1466dm_bufio_shrink_scan(struct shrinker *shrink, struct shrink_control *sc)
1463{ 1467{
1464 struct dm_bufio_client *c = 1468 struct dm_bufio_client *c;
1465 container_of(shrinker, struct dm_bufio_client, shrinker); 1469 unsigned long freed;
1466 unsigned long r;
1467 unsigned long nr_to_scan = sc->nr_to_scan;
1468 1470
1471 c = container_of(shrink, struct dm_bufio_client, shrinker);
1469 if (sc->gfp_mask & __GFP_IO) 1472 if (sc->gfp_mask & __GFP_IO)
1470 dm_bufio_lock(c); 1473 dm_bufio_lock(c);
1471 else if (!dm_bufio_trylock(c)) 1474 else if (!dm_bufio_trylock(c))
1472 return !nr_to_scan ? 0 : -1; 1475 return SHRINK_STOP;
1473 1476
1474 if (nr_to_scan) 1477 freed = __scan(c, sc->nr_to_scan, sc->gfp_mask);
1475 __scan(c, nr_to_scan, sc); 1478 dm_bufio_unlock(c);
1479 return freed;
1480}
1476 1481
1477 r = c->n_buffers[LIST_CLEAN] + c->n_buffers[LIST_DIRTY]; 1482static unsigned long
1478 if (r > INT_MAX) 1483dm_bufio_shrink_count(struct shrinker *shrink, struct shrink_control *sc)
1479 r = INT_MAX; 1484{
1485 struct dm_bufio_client *c;
1486 unsigned long count;
1480 1487
1481 dm_bufio_unlock(c); 1488 c = container_of(shrink, struct dm_bufio_client, shrinker);
1489 if (sc->gfp_mask & __GFP_IO)
1490 dm_bufio_lock(c);
1491 else if (!dm_bufio_trylock(c))
1492 return 0;
1482 1493
1483 return r; 1494 count = c->n_buffers[LIST_CLEAN] + c->n_buffers[LIST_DIRTY];
1495 dm_bufio_unlock(c);
1496 return count;
1484} 1497}
1485 1498
1486/* 1499/*
@@ -1582,7 +1595,8 @@ struct dm_bufio_client *dm_bufio_client_create(struct block_device *bdev, unsign
1582 __cache_size_refresh(); 1595 __cache_size_refresh();
1583 mutex_unlock(&dm_bufio_clients_lock); 1596 mutex_unlock(&dm_bufio_clients_lock);
1584 1597
1585 c->shrinker.shrink = shrink; 1598 c->shrinker.count_objects = dm_bufio_shrink_count;
1599 c->shrinker.scan_objects = dm_bufio_shrink_scan;
1586 c->shrinker.seeks = 1; 1600 c->shrinker.seeks = 1;
1587 c->shrinker.batch = 0; 1601 c->shrinker.batch = 0;
1588 register_shrinker(&c->shrinker); 1602 register_shrinker(&c->shrinker);
@@ -1669,7 +1683,7 @@ static void cleanup_old_buffers(void)
1669 struct dm_buffer *b; 1683 struct dm_buffer *b;
1670 b = list_entry(c->lru[LIST_CLEAN].prev, 1684 b = list_entry(c->lru[LIST_CLEAN].prev,
1671 struct dm_buffer, lru_list); 1685 struct dm_buffer, lru_list);
1672 if (__cleanup_old_buffer(b, 0, max_age * HZ)) 1686 if (!__cleanup_old_buffer(b, 0, max_age * HZ))
1673 break; 1687 break;
1674 dm_bufio_cond_resched(); 1688 dm_bufio_cond_resched();
1675 } 1689 }
diff --git a/drivers/staging/android/ashmem.c b/drivers/staging/android/ashmem.c
index 65f36d728714..8e76ddca0999 100644
--- a/drivers/staging/android/ashmem.c
+++ b/drivers/staging/android/ashmem.c
@@ -341,27 +341,26 @@ out:
341/* 341/*
342 * ashmem_shrink - our cache shrinker, called from mm/vmscan.c :: shrink_slab 342 * ashmem_shrink - our cache shrinker, called from mm/vmscan.c :: shrink_slab
343 * 343 *
344 * 'nr_to_scan' is the number of objects (pages) to prune, or 0 to query how 344 * 'nr_to_scan' is the number of objects to scan for freeing.
345 * many objects (pages) we have in total.
346 * 345 *
347 * 'gfp_mask' is the mask of the allocation that got us into this mess. 346 * 'gfp_mask' is the mask of the allocation that got us into this mess.
348 * 347 *
349 * Return value is the number of objects (pages) remaining, or -1 if we cannot 348 * Return value is the number of objects freed or -1 if we cannot
350 * proceed without risk of deadlock (due to gfp_mask). 349 * proceed without risk of deadlock (due to gfp_mask).
351 * 350 *
352 * We approximate LRU via least-recently-unpinned, jettisoning unpinned partial 351 * We approximate LRU via least-recently-unpinned, jettisoning unpinned partial
353 * chunks of ashmem regions LRU-wise one-at-a-time until we hit 'nr_to_scan' 352 * chunks of ashmem regions LRU-wise one-at-a-time until we hit 'nr_to_scan'
354 * pages freed. 353 * pages freed.
355 */ 354 */
356static int ashmem_shrink(struct shrinker *s, struct shrink_control *sc) 355static unsigned long
356ashmem_shrink_scan(struct shrinker *shrink, struct shrink_control *sc)
357{ 357{
358 struct ashmem_range *range, *next; 358 struct ashmem_range *range, *next;
359 unsigned long freed = 0;
359 360
360 /* We might recurse into filesystem code, so bail out if necessary */ 361 /* We might recurse into filesystem code, so bail out if necessary */
361 if (sc->nr_to_scan && !(sc->gfp_mask & __GFP_FS)) 362 if (!(sc->gfp_mask & __GFP_FS))
362 return -1; 363 return SHRINK_STOP;
363 if (!sc->nr_to_scan)
364 return lru_count;
365 364
366 mutex_lock(&ashmem_mutex); 365 mutex_lock(&ashmem_mutex);
367 list_for_each_entry_safe(range, next, &ashmem_lru_list, lru) { 366 list_for_each_entry_safe(range, next, &ashmem_lru_list, lru) {
@@ -374,17 +373,32 @@ static int ashmem_shrink(struct shrinker *s, struct shrink_control *sc)
374 range->purged = ASHMEM_WAS_PURGED; 373 range->purged = ASHMEM_WAS_PURGED;
375 lru_del(range); 374 lru_del(range);
376 375
377 sc->nr_to_scan -= range_size(range); 376 freed += range_size(range);
378 if (sc->nr_to_scan <= 0) 377 if (--sc->nr_to_scan <= 0)
379 break; 378 break;
380 } 379 }
381 mutex_unlock(&ashmem_mutex); 380 mutex_unlock(&ashmem_mutex);
381 return freed;
382}
382 383
384static unsigned long
385ashmem_shrink_count(struct shrinker *shrink, struct shrink_control *sc)
386{
387 /*
388 * note that lru_count is count of pages on the lru, not a count of
389 * objects on the list. This means the scan function needs to return the
390 * number of pages freed, not the number of objects scanned.
391 */
383 return lru_count; 392 return lru_count;
384} 393}
385 394
386static struct shrinker ashmem_shrinker = { 395static struct shrinker ashmem_shrinker = {
387 .shrink = ashmem_shrink, 396 .count_objects = ashmem_shrink_count,
397 .scan_objects = ashmem_shrink_scan,
398 /*
399 * XXX (dchinner): I wish people would comment on why they need on
400 * significant changes to the default value here
401 */
388 .seeks = DEFAULT_SEEKS * 4, 402 .seeks = DEFAULT_SEEKS * 4,
389}; 403};
390 404
@@ -690,14 +704,11 @@ static long ashmem_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
690 if (capable(CAP_SYS_ADMIN)) { 704 if (capable(CAP_SYS_ADMIN)) {
691 struct shrink_control sc = { 705 struct shrink_control sc = {
692 .gfp_mask = GFP_KERNEL, 706 .gfp_mask = GFP_KERNEL,
693 .nr_to_scan = 0, 707 .nr_to_scan = LONG_MAX,
694 }; 708 };
695 709
696 nodes_setall(sc.nodes_to_scan); 710 nodes_setall(sc.nodes_to_scan);
697 711 ashmem_shrink_scan(&ashmem_shrinker, &sc);
698 ret = ashmem_shrink(&ashmem_shrinker, &sc);
699 sc.nr_to_scan = ret;
700 ashmem_shrink(&ashmem_shrinker, &sc);
701 } 712 }
702 break; 713 break;
703 } 714 }
diff --git a/drivers/staging/android/lowmemorykiller.c b/drivers/staging/android/lowmemorykiller.c
index fe74494868ef..6f094b37f1f1 100644
--- a/drivers/staging/android/lowmemorykiller.c
+++ b/drivers/staging/android/lowmemorykiller.c
@@ -66,11 +66,20 @@ static unsigned long lowmem_deathpending_timeout;
66 pr_info(x); \ 66 pr_info(x); \
67 } while (0) 67 } while (0)
68 68
69static int lowmem_shrink(struct shrinker *s, struct shrink_control *sc) 69static unsigned long lowmem_count(struct shrinker *s,
70 struct shrink_control *sc)
71{
72 return global_page_state(NR_ACTIVE_ANON) +
73 global_page_state(NR_ACTIVE_FILE) +
74 global_page_state(NR_INACTIVE_ANON) +
75 global_page_state(NR_INACTIVE_FILE);
76}
77
78static unsigned long lowmem_scan(struct shrinker *s, struct shrink_control *sc)
70{ 79{
71 struct task_struct *tsk; 80 struct task_struct *tsk;
72 struct task_struct *selected = NULL; 81 struct task_struct *selected = NULL;
73 int rem = 0; 82 unsigned long rem = 0;
74 int tasksize; 83 int tasksize;
75 int i; 84 int i;
76 short min_score_adj = OOM_SCORE_ADJ_MAX + 1; 85 short min_score_adj = OOM_SCORE_ADJ_MAX + 1;
@@ -92,19 +101,17 @@ static int lowmem_shrink(struct shrinker *s, struct shrink_control *sc)
92 break; 101 break;
93 } 102 }
94 } 103 }
95 if (sc->nr_to_scan > 0) 104
96 lowmem_print(3, "lowmem_shrink %lu, %x, ofree %d %d, ma %hd\n", 105 lowmem_print(3, "lowmem_scan %lu, %x, ofree %d %d, ma %hd\n",
97 sc->nr_to_scan, sc->gfp_mask, other_free, 106 sc->nr_to_scan, sc->gfp_mask, other_free,
98 other_file, min_score_adj); 107 other_file, min_score_adj);
99 rem = global_page_state(NR_ACTIVE_ANON) + 108
100 global_page_state(NR_ACTIVE_FILE) + 109 if (min_score_adj == OOM_SCORE_ADJ_MAX + 1) {
101 global_page_state(NR_INACTIVE_ANON) + 110 lowmem_print(5, "lowmem_scan %lu, %x, return 0\n",
102 global_page_state(NR_INACTIVE_FILE); 111 sc->nr_to_scan, sc->gfp_mask);
103 if (sc->nr_to_scan <= 0 || min_score_adj == OOM_SCORE_ADJ_MAX + 1) { 112 return 0;
104 lowmem_print(5, "lowmem_shrink %lu, %x, return %d\n",
105 sc->nr_to_scan, sc->gfp_mask, rem);
106 return rem;
107 } 113 }
114
108 selected_oom_score_adj = min_score_adj; 115 selected_oom_score_adj = min_score_adj;
109 116
110 rcu_read_lock(); 117 rcu_read_lock();
@@ -154,16 +161,18 @@ static int lowmem_shrink(struct shrinker *s, struct shrink_control *sc)
154 lowmem_deathpending_timeout = jiffies + HZ; 161 lowmem_deathpending_timeout = jiffies + HZ;
155 send_sig(SIGKILL, selected, 0); 162 send_sig(SIGKILL, selected, 0);
156 set_tsk_thread_flag(selected, TIF_MEMDIE); 163 set_tsk_thread_flag(selected, TIF_MEMDIE);
157 rem -= selected_tasksize; 164 rem += selected_tasksize;
158 } 165 }
159 lowmem_print(4, "lowmem_shrink %lu, %x, return %d\n", 166
167 lowmem_print(4, "lowmem_scan %lu, %x, return %lu\n",
160 sc->nr_to_scan, sc->gfp_mask, rem); 168 sc->nr_to_scan, sc->gfp_mask, rem);
161 rcu_read_unlock(); 169 rcu_read_unlock();
162 return rem; 170 return rem;
163} 171}
164 172
165static struct shrinker lowmem_shrinker = { 173static struct shrinker lowmem_shrinker = {
166 .shrink = lowmem_shrink, 174 .scan_objects = lowmem_scan,
175 .count_objects = lowmem_count,
167 .seeks = DEFAULT_SEEKS * 16 176 .seeks = DEFAULT_SEEKS * 16
168}; 177};
169 178