Commit 48b09612 authored by Maarten Lankhorst's avatar Maarten Lankhorst
Browse files

drm/i915: Move __i915_gem_free_object to ttm_bo_destroy



When we implement delayed destroy, we may have a second
call to the delete_mem_notify() handler, while free_object()
only should be called once.

Move it to bo->destroy(), to ensure it's only called once.
This fixes some weird memory corruption issues with delayed
destroy when async eviction is used.

Signed-off-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210830121006.2978297-2-maarten.lankhorst@linux.intel.com


Fixes: 213d5092 ("drm/i915/ttm: Introduce a TTM i915 gem object backend")
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Reviewed-by: default avatarThomas Hellström <thomas.hellstrom@linux.intel.com>
parent dc34ca92
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -356,11 +356,8 @@ static void i915_ttm_delete_mem_notify(struct ttm_buffer_object *bo)
{
	struct drm_i915_gem_object *obj = i915_ttm_to_gem(bo);

	if (likely(obj)) {
		/* This releases all gem object bindings to the backend. */
	if (likely(obj))
		i915_ttm_free_cached_io_st(obj);
		__i915_gem_free_object(obj);
	}
}

static struct intel_memory_region *
@@ -886,8 +883,12 @@ void i915_ttm_bo_destroy(struct ttm_buffer_object *bo)
{
	struct drm_i915_gem_object *obj = i915_ttm_to_gem(bo);

	/* This releases all gem object bindings to the backend. */
	__i915_gem_free_object(obj);

	i915_gem_object_release_memory_region(obj);
	mutex_destroy(&obj->ttm.get_io_page.lock);

	if (obj->ttm.created)
		call_rcu(&obj->rcu, __i915_gem_free_object_rcu);
}