diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 43 |
1 files changed, 25 insertions, 18 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 078858178832..ac534c9a2f81 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -607,8 +607,6 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
607 | case -EAGAIN: | 607 | case -EAGAIN: |
608 | return VM_FAULT_OOM; | 608 | return VM_FAULT_OOM; |
609 | case -EFAULT: | 609 | case -EFAULT: |
610 | case -EBUSY: | ||
611 | DRM_ERROR("can't insert pfn?? fault or busy...\n"); | ||
612 | return VM_FAULT_SIGBUS; | 610 | return VM_FAULT_SIGBUS; |
613 | default: | 611 | default: |
614 | return VM_FAULT_NOPAGE; | 612 | return VM_FAULT_NOPAGE; |
@@ -684,6 +682,30 @@ out_free_list: | |||
684 | return ret; | 682 | return ret; |
685 | } | 683 | } |
686 | 684 | ||
685 | static void | ||
686 | i915_gem_free_mmap_offset(struct drm_gem_object *obj) | ||
687 | { | ||
688 | struct drm_device *dev = obj->dev; | ||
689 | struct drm_i915_gem_object *obj_priv = obj->driver_private; | ||
690 | struct drm_gem_mm *mm = dev->mm_private; | ||
691 | struct drm_map_list *list; | ||
692 | |||
693 | list = &obj->map_list; | ||
694 | drm_ht_remove_item(&mm->offset_hash, &list->hash); | ||
695 | |||
696 | if (list->file_offset_node) { | ||
697 | drm_mm_put_block(list->file_offset_node); | ||
698 | list->file_offset_node = NULL; | ||
699 | } | ||
700 | |||
701 | if (list->map) { | ||
702 | drm_free(list->map, sizeof(struct drm_map), DRM_MEM_DRIVER); | ||
703 | list->map = NULL; | ||
704 | } | ||
705 | |||
706 | obj_priv->mmap_offset = 0; | ||
707 | } | ||
708 | |||
687 | /** | 709 | /** |
688 | * i915_gem_get_gtt_alignment - return required GTT alignment for an object | 710 | * i915_gem_get_gtt_alignment - return required GTT alignment for an object |
689 | * @obj: object to check | 711 | * @obj: object to check |
@@ -2896,9 +2918,6 @@ int i915_gem_init_object(struct drm_gem_object *obj) | |||
2896 | void i915_gem_free_object(struct drm_gem_object *obj) | 2918 | void i915_gem_free_object(struct drm_gem_object *obj) |
2897 | { | 2919 | { |
2898 | struct drm_device *dev = obj->dev; | 2920 | struct drm_device *dev = obj->dev; |
2899 | struct drm_gem_mm *mm = dev->mm_private; | ||
2900 | struct drm_map_list *list; | ||
2901 | struct drm_map *map; | ||
2902 | struct drm_i915_gem_object *obj_priv = obj->driver_private; | 2921 | struct drm_i915_gem_object *obj_priv = obj->driver_private; |
2903 | 2922 | ||
2904 | while (obj_priv->pin_count > 0) | 2923 | while (obj_priv->pin_count > 0) |
@@ -2909,19 +2928,7 @@ void i915_gem_free_object(struct drm_gem_object *obj) | |||
2909 | 2928 | ||
2910 | i915_gem_object_unbind(obj); | 2929 | i915_gem_object_unbind(obj); |
2911 | 2930 | ||
2912 | list = &obj->map_list; | 2931 | i915_gem_free_mmap_offset(obj); |
2913 | drm_ht_remove_item(&mm->offset_hash, &list->hash); | ||
2914 | |||
2915 | if (list->file_offset_node) { | ||
2916 | drm_mm_put_block(list->file_offset_node); | ||
2917 | list->file_offset_node = NULL; | ||
2918 | } | ||
2919 | |||
2920 | map = list->map; | ||
2921 | if (map) { | ||
2922 | drm_free(map, sizeof(*map), DRM_MEM_DRIVER); | ||
2923 | list->map = NULL; | ||
2924 | } | ||
2925 | 2932 | ||
2926 | drm_free(obj_priv->page_cpu_valid, 1, DRM_MEM_DRIVER); | 2933 | drm_free(obj_priv->page_cpu_valid, 1, DRM_MEM_DRIVER); |
2927 | drm_free(obj->driver_private, 1, DRM_MEM_DRIVER); | 2934 | drm_free(obj->driver_private, 1, DRM_MEM_DRIVER); |