> -----Original Message----- > From: Intel-gfx [mailto:intel-gfx-bounces@xxxxxxxxxxxxxxxxxxxxx] On Behalf > Of Chris Wilson > Sent: Tuesday, March 25, 2014 1:23 PM > To: intel-gfx@xxxxxxxxxxxxxxxxxxxxx > Cc: Hugh Dickins > Subject: [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@xxxxxxxxxxxxxxxxxx> Reviewed-by: Rafael Barbalho <rafael.barbalho@xxxxxxxxx> > --- > 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@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx