aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_gem.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2013-10-04 05:33:00 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-10-10 06:46:48 -0400
commitd9973b4356096e8b040d6eba02407bccdaf101af (patch)
tree13622285de53c4501af4e81709f10f692db2741c /drivers/gpu/drm/i915/i915_gem.c
parent5035c275af811b93dec5df6d064e0b2319cf59c8 (diff)
drm/i915: Fix type mismatch and accounting in i915_gem_shrink
The interface uses an unsigned long, and we can use the unsigned counter throughout our code, so do so. In the process, we notice one instance where the shrink count is based on a heuristic rather than the result, and another where we ask for too many pages to be purged. v2: nr_to_scan needs to be promoted to a long as well, so just use sc->nr_to_scan directly. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem.c')
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 7dc9c9c7778c..ed9311aaabe7 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -64,8 +64,8 @@ static unsigned long i915_gem_inactive_count(struct shrinker *shrinker,
64 struct shrink_control *sc); 64 struct shrink_control *sc);
65static unsigned long i915_gem_inactive_scan(struct shrinker *shrinker, 65static unsigned long i915_gem_inactive_scan(struct shrinker *shrinker,
66 struct shrink_control *sc); 66 struct shrink_control *sc);
67static long i915_gem_purge(struct drm_i915_private *dev_priv, long target); 67static unsigned long i915_gem_purge(struct drm_i915_private *dev_priv, long target);
68static long i915_gem_shrink_all(struct drm_i915_private *dev_priv); 68static unsigned long i915_gem_shrink_all(struct drm_i915_private *dev_priv);
69static void i915_gem_object_truncate(struct drm_i915_gem_object *obj); 69static void i915_gem_object_truncate(struct drm_i915_gem_object *obj);
70 70
71static bool cpu_cache_is_coherent(struct drm_device *dev, 71static bool cpu_cache_is_coherent(struct drm_device *dev,
@@ -1728,13 +1728,13 @@ i915_gem_object_put_pages(struct drm_i915_gem_object *obj)
1728 return 0; 1728 return 0;
1729} 1729}
1730 1730
1731static long 1731static unsigned long
1732__i915_gem_shrink(struct drm_i915_private *dev_priv, long target, 1732__i915_gem_shrink(struct drm_i915_private *dev_priv, long target,
1733 bool purgeable_only) 1733 bool purgeable_only)
1734{ 1734{
1735 struct list_head still_bound_list; 1735 struct list_head still_bound_list;
1736 struct drm_i915_gem_object *obj, *next; 1736 struct drm_i915_gem_object *obj, *next;
1737 long count = 0; 1737 unsigned long count = 0;
1738 1738
1739 list_for_each_entry_safe(obj, next, 1739 list_for_each_entry_safe(obj, next,
1740 &dev_priv->mm.unbound_list, 1740 &dev_priv->mm.unbound_list,
@@ -1800,13 +1800,13 @@ __i915_gem_shrink(struct drm_i915_private *dev_priv, long target,
1800 return count; 1800 return count;
1801} 1801}
1802 1802
1803static long 1803static unsigned long
1804i915_gem_purge(struct drm_i915_private *dev_priv, long target) 1804i915_gem_purge(struct drm_i915_private *dev_priv, long target)
1805{ 1805{
1806 return __i915_gem_shrink(dev_priv, target, true); 1806 return __i915_gem_shrink(dev_priv, target, true);
1807} 1807}
1808 1808
1809static long 1809static unsigned long
1810i915_gem_shrink_all(struct drm_i915_private *dev_priv) 1810i915_gem_shrink_all(struct drm_i915_private *dev_priv)
1811{ 1811{
1812 struct drm_i915_gem_object *obj, *next; 1812 struct drm_i915_gem_object *obj, *next;
@@ -1816,9 +1816,8 @@ i915_gem_shrink_all(struct drm_i915_private *dev_priv)
1816 1816
1817 list_for_each_entry_safe(obj, next, &dev_priv->mm.unbound_list, 1817 list_for_each_entry_safe(obj, next, &dev_priv->mm.unbound_list,
1818 global_list) { 1818 global_list) {
1819 if (obj->pages_pin_count == 0) 1819 if (i915_gem_object_put_pages(obj) == 0)
1820 freed += obj->base.size >> PAGE_SHIFT; 1820 freed += obj->base.size >> PAGE_SHIFT;
1821 i915_gem_object_put_pages(obj);
1822 } 1821 }
1823 return freed; 1822 return freed;
1824} 1823}
@@ -4947,6 +4946,7 @@ i915_gem_inactive_count(struct shrinker *shrinker, struct shrink_control *sc)
4947 4946
4948 if (unlock) 4947 if (unlock)
4949 mutex_unlock(&dev->struct_mutex); 4948 mutex_unlock(&dev->struct_mutex);
4949
4950 return count; 4950 return count;
4951} 4951}
4952 4952
@@ -5018,7 +5018,6 @@ i915_gem_inactive_scan(struct shrinker *shrinker, struct shrink_control *sc)
5018 struct drm_i915_private, 5018 struct drm_i915_private,
5019 mm.inactive_shrinker); 5019 mm.inactive_shrinker);
5020 struct drm_device *dev = dev_priv->dev; 5020 struct drm_device *dev = dev_priv->dev;
5021 int nr_to_scan = sc->nr_to_scan;
5022 unsigned long freed; 5021 unsigned long freed;
5023 bool unlock = true; 5022 bool unlock = true;
5024 5023
@@ -5032,15 +5031,17 @@ i915_gem_inactive_scan(struct shrinker *shrinker, struct shrink_control *sc)
5032 unlock = false; 5031 unlock = false;
5033 } 5032 }
5034 5033
5035 freed = i915_gem_purge(dev_priv, nr_to_scan); 5034 freed = i915_gem_purge(dev_priv, sc->nr_to_scan);
5036 if (freed < nr_to_scan) 5035 if (freed < sc->nr_to_scan)
5037 freed += __i915_gem_shrink(dev_priv, nr_to_scan, 5036 freed += __i915_gem_shrink(dev_priv,
5038 false); 5037 sc->nr_to_scan - freed,
5039 if (freed < nr_to_scan) 5038 false);
5039 if (freed < sc->nr_to_scan)
5040 freed += i915_gem_shrink_all(dev_priv); 5040 freed += i915_gem_shrink_all(dev_priv);
5041 5041
5042 if (unlock) 5042 if (unlock)
5043 mutex_unlock(&dev->struct_mutex); 5043 mutex_unlock(&dev->struct_mutex);
5044
5044 return freed; 5045 return freed;
5045} 5046}
5046 5047