[Intel-gfx] [PATCH 3/4] drm/i915: Refactor common lock handling between shrinker count/scan

Barbalho, Rafael rafael.barbalho at intel.com
Mon May 19 18:05:41 CEST 2014


> -----Original Message-----
> From: Intel-gfx [mailto:intel-gfx-bounces at lists.freedesktop.org] On Behalf
> Of Chris Wilson
> Sent: Tuesday, March 25, 2014 1:23 PM
> To: intel-gfx at lists.freedesktop.org
> Cc: Hugh Dickins
> Subject: [Intel-gfx] [PATCH 3/4] drm/i915: Refactor common lock handling
> between shrinker count/scan
> 
> We can share a few lines of tricky lock handling we need to use for both
> shrinker routines and in the process fix the return value for count() when
> reporting a deadlock.
> 
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
Reviewed-by: Rafael Barbalho <rafael.barbalho at intel.com>
> ---
>  drivers/gpu/drm/i915/i915_gem.c | 42 +++++++++++++++++++++------------
> --------
>  1 file changed, 22 insertions(+), 20 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem.c
> b/drivers/gpu/drm/i915/i915_gem.c index 219fe35f9c45..135ee8bd55f6
> 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -4913,6 +4913,22 @@ static bool mutex_is_locked_by(struct mutex
> *mutex, struct task_struct *task)  #endif  }
> 
> +static bool i915_gem_shrinker_lock(struct drm_device *dev, bool
> +*unlock) {
> +	if (!mutex_trylock(&dev->struct_mutex)) {
> +		if (!mutex_is_locked_by(&dev->struct_mutex, current))
> +			return false;
> +
> +		if (to_i915(dev)->mm.shrinker_no_lock_stealing)
> +			return false;
> +
> +		*unlock = false;
> +	} else
> +		*unlock = true;
> +
> +	return true;
> +}
> +
>  static int num_vma_bound(struct drm_i915_gem_object *obj)  {
>  	struct i915_vma *vma;
> @@ -4932,18 +4948,11 @@ i915_gem_shrinker_count(struct shrinker
> *shrinker, struct shrink_control *sc)
>  		container_of(shrinker, struct drm_i915_private,
> mm.shrinker);
>  	struct drm_device *dev = dev_priv->dev;
>  	struct drm_i915_gem_object *obj;
> -	bool unlock = true;
>  	unsigned long count;
> +	bool unlock;
> 
> -	if (!mutex_trylock(&dev->struct_mutex)) {
> -		if (!mutex_is_locked_by(&dev->struct_mutex, current))
> -			return 0;
> -
> -		if (dev_priv->mm.shrinker_no_lock_stealing)
> -			return 0;
> -
> -		unlock = false;
> -	}
> +	if (!i915_gem_shrinker_lock(dev, &unlock))
> +		return 0;
> 
>  	count = 0;
>  	list_for_each_entry(obj, &dev_priv->mm.unbound_list, global_list)
> @@ -5031,17 +5040,10 @@ i915_gem_shrinker_scan(struct shrinker
> *shrinker, struct shrink_control *sc)
>  		container_of(shrinker, struct drm_i915_private,
> mm.shrinker);
>  	struct drm_device *dev = dev_priv->dev;
>  	unsigned long freed;
> -	bool unlock = true;
> +	bool unlock;
> 
> -	if (!mutex_trylock(&dev->struct_mutex)) {
> -		if (!mutex_is_locked_by(&dev->struct_mutex, current))
> -			return SHRINK_STOP;
> -
> -		if (dev_priv->mm.shrinker_no_lock_stealing)
> -			return SHRINK_STOP;
> -
> -		unlock = false;
> -	}
> +	if (!i915_gem_shrinker_lock(dev, &unlock))
> +		return SHRINK_STOP;
> 
>  	freed = i915_gem_purge(dev_priv, sc->nr_to_scan);
>  	if (freed < sc->nr_to_scan)
> --
> 1.9.1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx



More information about the Intel-gfx mailing list