drm/i915: check memory is mappable in read_from_page
authorMatthew Auld <matthew.auld@intel.com>
Tue, 4 Oct 2022 13:19:16 +0000 (14:19 +0100)
committerMatthew Auld <matthew.auld@intel.com>
Wed, 5 Oct 2022 08:02:45 +0000 (09:02 +0100)
On small-bar systems we could be given something non-mappable here,
which leads to nasty oops. Make this nicer by checking if the resource
is mappable or not, and return an error otherwise.

v2: drop GEM_BUG_ON(flags & I915_BO_ALLOC_GPU_ONLY)

Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Cc: Jianshui Yu <jianshui.yu@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Nirmoy Das <nirmoy.das@intel.com>
Reviewed-by: Nirmoy Das <nirmoy.das@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20221004131916.233474-5-matthew.auld@intel.com
drivers/gpu/drm/i915/gem/i915_gem_object.c

index 369006c..62495d5 100644 (file)
@@ -444,6 +444,16 @@ i915_gem_object_read_from_page_iomap(struct drm_i915_gem_object *obj, u64 offset
        io_mapping_unmap(src_map);
 }
 
+static bool object_has_mappable_iomem(struct drm_i915_gem_object *obj)
+{
+       GEM_BUG_ON(!i915_gem_object_has_iomem(obj));
+
+       if (IS_DGFX(to_i915(obj->base.dev)))
+               return i915_ttm_resource_mappable(i915_gem_to_ttm(obj)->resource);
+
+       return true;
+}
+
 /**
  * i915_gem_object_read_from_page - read data from the page of a GEM object
  * @obj: GEM object to read from
@@ -466,7 +476,7 @@ int i915_gem_object_read_from_page(struct drm_i915_gem_object *obj, u64 offset,
 
        if (i915_gem_object_has_struct_page(obj))
                i915_gem_object_read_from_page_kmap(obj, offset, dst, size);
-       else if (i915_gem_object_has_iomem(obj))
+       else if (i915_gem_object_has_iomem(obj) && object_has_mappable_iomem(obj))
                i915_gem_object_read_from_page_iomap(obj, offset, dst, size);
        else
                return -ENODEV;