aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-11-20 05:45:16 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-11-21 11:45:04 -0500
commitfbdda6fb5ee5da401af42226878880069a6b8615 (patch)
treeac3d3d7036c3bb386145ff4306665a1f7b88f5c5
parentbe7cb6347e0c3aa1956748a860a2465a7ea128c4 (diff)
drm/i915: Guard pages being reaped by OOM whilst binding-to-GTT
In the circumstances that the shrinker is allowed to steal the mutex in order to reap pages, we need to be careful to prevent it operating on the current object and shooting ourselves in the foot. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index a2f1b8652d68..643b7f6368a0 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -2925,6 +2925,8 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
2925 if (ret) 2925 if (ret)
2926 return ret; 2926 return ret;
2927 2927
2928 i915_gem_object_pin_pages(obj);
2929
2928 search_free: 2930 search_free:
2929 if (map_and_fenceable) 2931 if (map_and_fenceable)
2930 free_space = 2932 free_space =
@@ -2955,14 +2957,17 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
2955 obj->cache_level, 2957 obj->cache_level,
2956 map_and_fenceable, 2958 map_and_fenceable,
2957 nonblocking); 2959 nonblocking);
2958 if (ret) 2960 if (ret) {
2961 i915_gem_object_unpin_pages(obj);
2959 return ret; 2962 return ret;
2963 }
2960 2964
2961 goto search_free; 2965 goto search_free;
2962 } 2966 }
2963 if (WARN_ON(!i915_gem_valid_gtt_space(dev, 2967 if (WARN_ON(!i915_gem_valid_gtt_space(dev,
2964 obj->gtt_space, 2968 obj->gtt_space,
2965 obj->cache_level))) { 2969 obj->cache_level))) {
2970 i915_gem_object_unpin_pages(obj);
2966 drm_mm_put_block(obj->gtt_space); 2971 drm_mm_put_block(obj->gtt_space);
2967 obj->gtt_space = NULL; 2972 obj->gtt_space = NULL;
2968 return -EINVAL; 2973 return -EINVAL;
@@ -2971,6 +2976,7 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
2971 2976
2972 ret = i915_gem_gtt_prepare_object(obj); 2977 ret = i915_gem_gtt_prepare_object(obj);
2973 if (ret) { 2978 if (ret) {
2979 i915_gem_object_unpin_pages(obj);
2974 drm_mm_put_block(obj->gtt_space); 2980 drm_mm_put_block(obj->gtt_space);
2975 obj->gtt_space = NULL; 2981 obj->gtt_space = NULL;
2976 return ret; 2982 return ret;
@@ -2993,6 +2999,7 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
2993 2999
2994 obj->map_and_fenceable = mappable && fenceable; 3000 obj->map_and_fenceable = mappable && fenceable;
2995 3001
3002 i915_gem_object_unpin_pages(obj);
2996 trace_i915_gem_object_bind(obj, map_and_fenceable); 3003 trace_i915_gem_object_bind(obj, map_and_fenceable);
2997 i915_gem_verify_gtt(dev); 3004 i915_gem_verify_gtt(dev);
2998 return 0; 3005 return 0;