On Tue, Sep 24, 2013 at 10:52:18AM +0100, Chris Wilson wrote: > 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. > > Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/i915_gem.c | 22 ++++++++++++---------- > 1 file changed, 12 insertions(+), 10 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c > index 1bfb792..af6ff15 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, > struct shrink_control *sc); > static unsigned long i915_gem_inactive_scan(struct shrinker *shrinker, > struct shrink_control *sc); > -static long i915_gem_purge(struct drm_i915_private *dev_priv, long target); > -static long i915_gem_shrink_all(struct drm_i915_private *dev_priv); > +static unsigned long i915_gem_purge(struct drm_i915_private *dev_priv, long target); > +static unsigned long i915_gem_shrink_all(struct drm_i915_private *dev_priv); > static void i915_gem_object_truncate(struct drm_i915_gem_object *obj); > > static bool cpu_cache_is_coherent(struct drm_device *dev, > @@ -1825,13 +1825,13 @@ i915_gem_object_put_pages(struct drm_i915_gem_object *obj) > return 0; > } > > -static long > +static unsigned long > __i915_gem_shrink(struct drm_i915_private *dev_priv, long target, > bool purgeable_only) > { > struct list_head still_bound_list; > struct drm_i915_gem_object *obj, *next; > - long count = 0; > + unsigned long count = 0; > > list_for_each_entry_safe(obj, next, > &dev_priv->mm.unbound_list, > @@ -1897,13 +1897,13 @@ __i915_gem_shrink(struct drm_i915_private *dev_priv, long target, > return count; > } > > -static long > +static unsigned long > i915_gem_purge(struct drm_i915_private *dev_priv, long target) > { > return __i915_gem_shrink(dev_priv, target, true); > } > > -static long > +static unsigned long > i915_gem_shrink_all(struct drm_i915_private *dev_priv) > { > struct drm_i915_gem_object *obj, *next; > @@ -1913,9 +1913,8 @@ i915_gem_shrink_all(struct drm_i915_private *dev_priv) > > list_for_each_entry_safe(obj, next, &dev_priv->mm.unbound_list, > global_list) { > - if (obj->pages_pin_count == 0) > + if (i915_gem_object_put_pages(obj) == 0) > freed += obj->base.size >> PAGE_SHIFT; > - i915_gem_object_put_pages(obj); > } > return freed; > } > @@ -5091,6 +5090,7 @@ i915_gem_inactive_count(struct shrinker *shrinker, struct shrink_control *sc) > > if (unlock) > mutex_unlock(&dev->struct_mutex); > + > return count; > } > > @@ -5178,12 +5178,14 @@ i915_gem_inactive_scan(struct shrinker *shrinker, struct shrink_control *sc) nr_to_scan here still seems to be an int. Otherwise looks good. -Daniel > > freed = i915_gem_purge(dev_priv, nr_to_scan); > if (freed < nr_to_scan) > - freed += __i915_gem_shrink(dev_priv, nr_to_scan, > - false); > + freed += __i915_gem_shrink(dev_priv, > + nr_to_scan - freed, > + false); > if (freed < nr_to_scan) > freed += i915_gem_shrink_all(dev_priv); > > if (unlock) > mutex_unlock(&dev->struct_mutex); > + > return freed; > } > -- > 1.8.4.rc3 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/intel-gfx -- Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx