> -----Original Message-----
> From: Intel-gfx [mailto:intel-gfx-boun...@lists.freedesktop.org] On Behalf
> Of Chris Wilson
> Sent: Tuesday, March 25, 2014 1:23 PM
> To: intel-gfx@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 <ch...@chris-wilson.co.uk>
Reviewed-by: Rafael Barbalho <rafael.barba...@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@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to