diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 4461336205ed..00c836154725 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -3106,7 +3106,7 @@ i915_find_fence_reg(struct drm_device *dev) | |||
3106 | } | 3106 | } |
3107 | 3107 | ||
3108 | if (avail == NULL) | 3108 | if (avail == NULL) |
3109 | return NULL; | 3109 | goto deadlock; |
3110 | 3110 | ||
3111 | /* None available, try to steal one or wait for a user to finish */ | 3111 | /* None available, try to steal one or wait for a user to finish */ |
3112 | list_for_each_entry(reg, &dev_priv->mm.fence_list, lru_list) { | 3112 | list_for_each_entry(reg, &dev_priv->mm.fence_list, lru_list) { |
@@ -3116,7 +3116,12 @@ i915_find_fence_reg(struct drm_device *dev) | |||
3116 | return reg; | 3116 | return reg; |
3117 | } | 3117 | } |
3118 | 3118 | ||
3119 | return NULL; | 3119 | deadlock: |
3120 | /* Wait for completion of pending flips which consume fences */ | ||
3121 | if (intel_has_pending_fb_unpin(dev)) | ||
3122 | return ERR_PTR(-EAGAIN); | ||
3123 | |||
3124 | return ERR_PTR(-EDEADLK); | ||
3120 | } | 3125 | } |
3121 | 3126 | ||
3122 | /** | 3127 | /** |
@@ -3161,8 +3166,8 @@ i915_gem_object_get_fence(struct drm_i915_gem_object *obj) | |||
3161 | } | 3166 | } |
3162 | } else if (enable) { | 3167 | } else if (enable) { |
3163 | reg = i915_find_fence_reg(dev); | 3168 | reg = i915_find_fence_reg(dev); |
3164 | if (reg == NULL) | 3169 | if (IS_ERR(reg)) |
3165 | return -EDEADLK; | 3170 | return PTR_ERR(reg); |
3166 | 3171 | ||
3167 | if (reg->obj) { | 3172 | if (reg->obj) { |
3168 | struct drm_i915_gem_object *old = reg->obj; | 3173 | struct drm_i915_gem_object *old = reg->obj; |