drm/i915: Drop the deferred active reference
An old optimisation to reduce the number of atomics per batch sadly relies on struct_mutex for coordination. In order to remove struct_mutex from serialising object/context closing, always taking and releasing an active reference on first use / last use greatly simplifies the locking. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Matthew Auld <matthew.auld@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20190528092956.14910-15-chris@chris-wilson.co.uk
此提交包含在:
@@ -112,10 +112,7 @@ static void __i915_vma_retire(struct i915_active *ref)
|
||||
*/
|
||||
obj_bump_mru(obj);
|
||||
|
||||
if (i915_gem_object_has_active_reference(obj)) {
|
||||
i915_gem_object_clear_active_reference(obj);
|
||||
i915_gem_object_put(obj);
|
||||
}
|
||||
i915_gem_object_put(obj); /* and drop the active reference */
|
||||
}
|
||||
|
||||
static struct i915_vma *
|
||||
@@ -443,7 +440,7 @@ void i915_vma_unpin_and_release(struct i915_vma **p_vma, unsigned int flags)
|
||||
if (flags & I915_VMA_RELEASE_MAP)
|
||||
i915_gem_object_unpin_map(obj);
|
||||
|
||||
__i915_gem_object_release_unless_active(obj);
|
||||
i915_gem_object_put(obj);
|
||||
}
|
||||
|
||||
bool i915_vma_misplaced(const struct i915_vma *vma,
|
||||
@@ -933,12 +930,12 @@ int i915_vma_move_to_active(struct i915_vma *vma,
|
||||
* add the active reference first and queue for it to be dropped
|
||||
* *last*.
|
||||
*/
|
||||
if (!vma->active.count)
|
||||
obj->active_count++;
|
||||
if (!vma->active.count && !obj->active_count++)
|
||||
i915_gem_object_get(obj); /* once more for the active ref */
|
||||
|
||||
if (unlikely(i915_active_ref(&vma->active, rq->fence.context, rq))) {
|
||||
if (!vma->active.count)
|
||||
obj->active_count--;
|
||||
if (!vma->active.count && !--obj->active_count)
|
||||
i915_gem_object_put(obj);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
新增問題並參考
封鎖使用者