From 302c26d7692f6942d7e87bd4f1bf53ea6e44816c Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Mon, 2 Dec 2013 22:22:40 +0000 Subject: [PATCH] mm,drm/i915: Aggressively tune the shrinker Signed-off-by: Chris Wilson --- drivers/gpu/drm/i915/i915_gem.c | 15 ++++++++++----- mm/vmscan.c | 4 ++-- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index ffad111..d91785d 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -1858,7 +1858,8 @@ __i915_gem_shrink(struct drm_i915_private *dev_priv, long target, typeof(*obj), global_list); list_move_tail(&obj->global_list, &still_bound_list); - if (!i915_gem_object_is_purgeable(obj) && purgeable_only) + if (purgeable_only && + (!i915_gem_object_is_purgeable(obj) || obj->ring)) continue; /* @@ -4810,7 +4811,8 @@ i915_gem_load(struct drm_device *dev) dev_priv->mm.inactive_shrinker.scan_objects = i915_gem_inactive_scan; dev_priv->mm.inactive_shrinker.count_objects = i915_gem_inactive_count; - dev_priv->mm.inactive_shrinker.seeks = DEFAULT_SEEKS; + dev_priv->mm.inactive_shrinker.seeks = 1; + dev_priv->mm.inactive_shrinker.batch = 1; register_shrinker(&dev_priv->mm.inactive_shrinker); } @@ -5203,12 +5205,15 @@ i915_gem_inactive_scan(struct shrinker *shrinker, struct shrink_control *sc) } freed = i915_gem_purge(dev_priv, sc->nr_to_scan); - if (freed < sc->nr_to_scan) + if (freed == 0) { freed += __i915_gem_shrink(dev_priv, sc->nr_to_scan - freed, false); - if (freed < sc->nr_to_scan) - freed += i915_gem_shrink_all(dev_priv); + if (freed < sc->nr_to_scan) + freed += i915_gem_shrink_all(dev_priv); + if (freed == 0) + freed = SHRINK_STOP; + } if (unlock) mutex_unlock(&dev->struct_mutex); diff --git a/mm/vmscan.c b/mm/vmscan.c index eea668d..9683661 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -290,8 +290,8 @@ shrink_slab_node(struct shrink_control *shrinkctl, struct shrinker *shrinker, break; freed += ret; - count_vm_events(SLABS_SCANNED, batch_size); - total_scan -= batch_size; + count_vm_events(SLABS_SCANNED, ret); + total_scan -= ret; cond_resched(); } -- 1.8.4.4