Commit 7024f80e authored by Matthew Auld's avatar Matthew Auld
Browse files

drm/i915: check memory is mappable in read_from_page



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: default avatarMatthew 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: default avatarNirmoy Das <nirmoy.das@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20221004131916.233474-5-matthew.auld@intel.com
parent e3afc690
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -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;