[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