aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-01-10 12:33:15 -0500
committerChris Wilson <chris@chris-wilson.co.uk>2011-01-11 17:55:48 -0500
commit809b63349ce6eb6603e7dab482c642f28135a2db (patch)
treee267d1640e6323cbbd93b7786973cf3f67d9c76c
parent092de6f225638ec300936bfcbdc67805733cc78c (diff)
drm/i915: If we hit OOM when allocating GTT pages, clear the aperture
Rather than evicting an object at random, which is unlikely to alleviate the memory pressure sufficient to allow us to continue, zap the entire aperture. That should give the system long enough to recover and reap some pages from the evicted objects, forestalling the allocation error for the new object. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c12
1 files changed, 4 insertions, 8 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 87c2df714f66..3dfc848ff755 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -2782,10 +2782,8 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
2782 obj->gtt_space = NULL; 2782 obj->gtt_space = NULL;
2783 2783
2784 if (ret == -ENOMEM) { 2784 if (ret == -ENOMEM) {
2785 /* first try to clear up some space from the GTT */ 2785 /* first try to reclaim some memory by clearing the GTT */
2786 ret = i915_gem_evict_something(dev, size, 2786 ret = i915_gem_evict_everything(dev, false);
2787 alignment,
2788 map_and_fenceable);
2789 if (ret) { 2787 if (ret) {
2790 /* now try to shrink everyone else */ 2788 /* now try to shrink everyone else */
2791 if (gfpmask) { 2789 if (gfpmask) {
@@ -2793,7 +2791,7 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
2793 goto search_free; 2791 goto search_free;
2794 } 2792 }
2795 2793
2796 return ret; 2794 return -ENOMEM;
2797 } 2795 }
2798 2796
2799 goto search_free; 2797 goto search_free;
@@ -2808,9 +2806,7 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
2808 drm_mm_put_block(obj->gtt_space); 2806 drm_mm_put_block(obj->gtt_space);
2809 obj->gtt_space = NULL; 2807 obj->gtt_space = NULL;
2810 2808
2811 ret = i915_gem_evict_something(dev, size, 2809 if (i915_gem_evict_everything(dev, false))
2812 alignment, map_and_fenceable);
2813 if (ret)
2814 return ret; 2810 return ret;
2815 2811
2816 goto search_free; 2812 goto search_free;