diff options
| author | Olof Johansson <olof@lixom.net> | 2013-01-27 22:07:11 -0800 | 
|---|---|---|
| committer | Olof Johansson <olof@lixom.net> | 2013-01-27 22:07:20 -0800 | 
| commit | 6b914c998787d65022e80d6262dfd0edef58cadb (patch) | |
| tree | ec9d9605ae08e6e40664c4302a181979ab4fe1d3 /drivers/gpu/drm/i915/i915_gem.c | |
| parent | 1f87a404d02a96519284e1928445ca5cfe9667db (diff) | |
| parent | 949db153b6466c6f7cad5a427ecea94985927311 (diff) | |
| download | olio-linux-3.10-6b914c998787d65022e80d6262dfd0edef58cadb.tar.xz olio-linux-3.10-6b914c998787d65022e80d6262dfd0edef58cadb.zip  | |
Merge tag 'v3.8-rc5' into next/cleanup
Linux 3.8-rc5
Signed-off-by: Olof Johansson <olof@lixom.net>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem.c')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 25 | 
1 files changed, 18 insertions, 7 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index da3c82e301b..8febea6daa0 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -1717,7 +1717,8 @@ i915_gem_object_put_pages(struct drm_i915_gem_object *obj)  }  static long -i915_gem_purge(struct drm_i915_private *dev_priv, long target) +__i915_gem_shrink(struct drm_i915_private *dev_priv, long target, +		  bool purgeable_only)  {  	struct drm_i915_gem_object *obj, *next;  	long count = 0; @@ -1725,7 +1726,7 @@ i915_gem_purge(struct drm_i915_private *dev_priv, long target)  	list_for_each_entry_safe(obj, next,  				 &dev_priv->mm.unbound_list,  				 gtt_list) { -		if (i915_gem_object_is_purgeable(obj) && +		if ((i915_gem_object_is_purgeable(obj) || !purgeable_only) &&  		    i915_gem_object_put_pages(obj) == 0) {  			count += obj->base.size >> PAGE_SHIFT;  			if (count >= target) @@ -1736,7 +1737,7 @@ i915_gem_purge(struct drm_i915_private *dev_priv, long target)  	list_for_each_entry_safe(obj, next,  				 &dev_priv->mm.inactive_list,  				 mm_list) { -		if (i915_gem_object_is_purgeable(obj) && +		if ((i915_gem_object_is_purgeable(obj) || !purgeable_only) &&  		    i915_gem_object_unbind(obj) == 0 &&  		    i915_gem_object_put_pages(obj) == 0) {  			count += obj->base.size >> PAGE_SHIFT; @@ -1748,6 +1749,12 @@ i915_gem_purge(struct drm_i915_private *dev_priv, long target)  	return count;  } +static long +i915_gem_purge(struct drm_i915_private *dev_priv, long target) +{ +	return __i915_gem_shrink(dev_priv, target, true); +} +  static void  i915_gem_shrink_all(struct drm_i915_private *dev_priv)  { @@ -3522,14 +3529,15 @@ i915_gem_pin_ioctl(struct drm_device *dev, void *data,  		goto out;  	} -	obj->user_pin_count++; -	obj->pin_filp = file; -	if (obj->user_pin_count == 1) { +	if (obj->user_pin_count == 0) {  		ret = i915_gem_object_pin(obj, args->alignment, true, false);  		if (ret)  			goto out;  	} +	obj->user_pin_count++; +	obj->pin_filp = file; +  	/* XXX - flush the CPU caches for pinned objects  	 * as the X server doesn't manage domains yet  	 */ @@ -4395,6 +4403,9 @@ i915_gem_inactive_shrink(struct shrinker *shrinker, struct shrink_control *sc)  	if (nr_to_scan) {  		nr_to_scan -= i915_gem_purge(dev_priv, nr_to_scan);  		if (nr_to_scan > 0) +			nr_to_scan -= __i915_gem_shrink(dev_priv, nr_to_scan, +							false); +		if (nr_to_scan > 0)  			i915_gem_shrink_all(dev_priv);  	} @@ -4402,7 +4413,7 @@ i915_gem_inactive_shrink(struct shrinker *shrinker, struct shrink_control *sc)  	list_for_each_entry(obj, &dev_priv->mm.unbound_list, gtt_list)  		if (obj->pages_pin_count == 0)  			cnt += obj->base.size >> PAGE_SHIFT; -	list_for_each_entry(obj, &dev_priv->mm.bound_list, gtt_list) +	list_for_each_entry(obj, &dev_priv->mm.inactive_list, gtt_list)  		if (obj->pin_count == 0 && obj->pages_pin_count == 0)  			cnt += obj->base.size >> PAGE_SHIFT;  |