diff options
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 29 |
1 files changed, 12 insertions, 17 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 4755ba41bfef..6129b7b4f1a5 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -1200,26 +1200,21 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
| 1200 | mutex_lock(&dev->struct_mutex); | 1200 | mutex_lock(&dev->struct_mutex); |
| 1201 | if (!obj_priv->gtt_space) { | 1201 | if (!obj_priv->gtt_space) { |
| 1202 | ret = i915_gem_object_bind_to_gtt(obj, 0); | 1202 | ret = i915_gem_object_bind_to_gtt(obj, 0); |
| 1203 | if (ret) { | 1203 | if (ret) |
| 1204 | mutex_unlock(&dev->struct_mutex); | 1204 | goto unlock; |
| 1205 | return VM_FAULT_SIGBUS; | 1205 | |
| 1206 | } | ||
| 1207 | list_add_tail(&obj_priv->list, &dev_priv->mm.inactive_list); | 1206 | list_add_tail(&obj_priv->list, &dev_priv->mm.inactive_list); |
| 1208 | 1207 | ||
| 1209 | ret = i915_gem_object_set_to_gtt_domain(obj, write); | 1208 | ret = i915_gem_object_set_to_gtt_domain(obj, write); |
| 1210 | if (ret) { | 1209 | if (ret) |
| 1211 | mutex_unlock(&dev->struct_mutex); | 1210 | goto unlock; |
| 1212 | return VM_FAULT_SIGBUS; | ||
| 1213 | } | ||
| 1214 | } | 1211 | } |
| 1215 | 1212 | ||
| 1216 | /* Need a new fence register? */ | 1213 | /* Need a new fence register? */ |
| 1217 | if (obj_priv->tiling_mode != I915_TILING_NONE) { | 1214 | if (obj_priv->tiling_mode != I915_TILING_NONE) { |
| 1218 | ret = i915_gem_object_get_fence_reg(obj); | 1215 | ret = i915_gem_object_get_fence_reg(obj); |
| 1219 | if (ret) { | 1216 | if (ret) |
| 1220 | mutex_unlock(&dev->struct_mutex); | 1217 | goto unlock; |
| 1221 | return VM_FAULT_SIGBUS; | ||
| 1222 | } | ||
| 1223 | } | 1218 | } |
| 1224 | 1219 | ||
| 1225 | pfn = ((dev->agp->base + obj_priv->gtt_offset) >> PAGE_SHIFT) + | 1220 | pfn = ((dev->agp->base + obj_priv->gtt_offset) >> PAGE_SHIFT) + |
| @@ -1227,18 +1222,18 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
| 1227 | 1222 | ||
| 1228 | /* Finally, remap it using the new GTT offset */ | 1223 | /* Finally, remap it using the new GTT offset */ |
| 1229 | ret = vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn); | 1224 | ret = vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn); |
| 1230 | 1225 | unlock: | |
| 1231 | mutex_unlock(&dev->struct_mutex); | 1226 | mutex_unlock(&dev->struct_mutex); |
| 1232 | 1227 | ||
| 1233 | switch (ret) { | 1228 | switch (ret) { |
| 1229 | case 0: | ||
| 1230 | case -ERESTARTSYS: | ||
| 1231 | return VM_FAULT_NOPAGE; | ||
| 1234 | case -ENOMEM: | 1232 | case -ENOMEM: |
| 1235 | case -EAGAIN: | 1233 | case -EAGAIN: |
| 1236 | return VM_FAULT_OOM; | 1234 | return VM_FAULT_OOM; |
| 1237 | case -EFAULT: | ||
| 1238 | case -EINVAL: | ||
| 1239 | return VM_FAULT_SIGBUS; | ||
| 1240 | default: | 1235 | default: |
| 1241 | return VM_FAULT_NOPAGE; | 1236 | return VM_FAULT_SIGBUS; |
| 1242 | } | 1237 | } |
| 1243 | } | 1238 | } |
| 1244 | 1239 | ||
