Commit f3170ba8 authored by Jason Ekstrand's avatar Jason Ekstrand Committed by Matthew Auld
Browse files

drm/i915/gem: Check object_can_migrate from object_migrate



We don't roll them together entirely because there are still a couple
cases where we want a separate can_migrate check.  For instance, the
display code checks that you can migrate a buffer to LMEM before it
accepts it in fb_create.  The dma-buf import code also uses it to do an
early check and return a different error code if someone tries to attach
a LMEM-only dma-buf to another driver.

However, no one actually wants to call object_migrate when can_migrate
has failed.  The stated intention is for self-tests but none of those
actually take advantage of this unsafe migration.

Signed-off-by: default avatarJason Ekstrand <jason@jlekstrand.net>
Cc: Daniel Vetter <daniel@ffwll.ch>
Reviewed-by: default avatarMatthew Auld <matthew.auld@intel.com>
Signed-off-by: default avatarMatthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210723172142.3273510-2-jason@jlekstrand.net
parent 816753c0
Loading
Loading
Loading
Loading
+2 −11
Original line number Diff line number Diff line
@@ -584,12 +584,6 @@ bool i915_gem_object_can_migrate(struct drm_i915_gem_object *obj,
 * completed yet, and to accomplish that, i915_gem_object_wait_migration()
 * must be called.
 *
 * This function is a bit more permissive than i915_gem_object_can_migrate()
 * to allow for migrating objects where the caller knows exactly what is
 * happening. For example within selftests. More specifically this
 * function allows migrating I915_BO_ALLOC_USER objects to regions
 * that are not in the list of allowable regions.
 *
 * Note: the @ww parameter is not used yet, but included to make sure
 * callers put some effort into obtaining a valid ww ctx if one is
 * available.
@@ -616,11 +610,8 @@ int i915_gem_object_migrate(struct drm_i915_gem_object *obj,
	if (obj->mm.region == mr)
		return 0;

	if (!i915_gem_object_evictable(obj))
		return -EBUSY;

	if (!obj->ops->migrate)
		return -EOPNOTSUPP;
	if (!i915_gem_object_can_migrate(obj, id))
		return -EINVAL;

	return obj->ops->migrate(obj, mr);
}
+0 −15
Original line number Diff line number Diff line
@@ -61,11 +61,6 @@ static int igt_create_migrate(struct intel_gt *gt, enum intel_region_id src,
		if (err)
			continue;

		if (!i915_gem_object_can_migrate(obj, dst)) {
			err = -EINVAL;
			continue;
		}

		err = i915_gem_object_migrate(obj, &ww, dst);
		if (err)
			continue;
@@ -114,11 +109,6 @@ static int lmem_pages_migrate_one(struct i915_gem_ww_ctx *ww,
		return err;

	if (i915_gem_object_is_lmem(obj)) {
		if (!i915_gem_object_can_migrate(obj, INTEL_REGION_SMEM)) {
			pr_err("object can't migrate to smem.\n");
			return -EINVAL;
		}

		err = i915_gem_object_migrate(obj, ww, INTEL_REGION_SMEM);
		if (err) {
			pr_err("Object failed migration to smem\n");
@@ -137,11 +127,6 @@ static int lmem_pages_migrate_one(struct i915_gem_ww_ctx *ww,
		}

	} else {
		if (!i915_gem_object_can_migrate(obj, INTEL_REGION_LMEM)) {
			pr_err("object can't migrate to lmem.\n");
			return -EINVAL;
		}

		err = i915_gem_object_migrate(obj, ww, INTEL_REGION_LMEM);
		if (err) {
			pr_err("Object failed migration to lmem\n");