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
このコミットが含まれているのは:
@@ -976,8 +976,6 @@ static int gpu_write(struct i915_vma *vma,
|
||||
if (err)
|
||||
goto err_request;
|
||||
|
||||
i915_gem_object_set_active_reference(batch->obj);
|
||||
|
||||
i915_vma_lock(vma);
|
||||
err = i915_gem_object_set_to_gtt_domain(vma->obj, false);
|
||||
if (err == 0)
|
||||
@@ -996,6 +994,7 @@ err_request:
|
||||
err_batch:
|
||||
i915_vma_unpin(batch);
|
||||
i915_vma_close(batch);
|
||||
i915_vma_put(batch);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@@ -365,7 +365,7 @@ static int igt_gem_coherency(void *arg)
|
||||
}
|
||||
}
|
||||
|
||||
__i915_gem_object_release_unless_active(obj);
|
||||
i915_gem_object_put(obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -377,7 +377,7 @@ unlock:
|
||||
return err;
|
||||
|
||||
put_object:
|
||||
__i915_gem_object_release_unless_active(obj);
|
||||
i915_gem_object_put(obj);
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
|
@@ -318,14 +318,14 @@ static int gpu_fill(struct drm_i915_gem_object *obj,
|
||||
if (err)
|
||||
goto skip_request;
|
||||
|
||||
i915_gem_object_set_active_reference(batch->obj);
|
||||
i915_request_add(rq);
|
||||
|
||||
i915_vma_unpin(batch);
|
||||
i915_vma_close(batch);
|
||||
i915_vma_put(batch);
|
||||
|
||||
i915_vma_unpin(vma);
|
||||
|
||||
i915_request_add(rq);
|
||||
|
||||
return 0;
|
||||
|
||||
skip_request:
|
||||
@@ -802,9 +802,9 @@ emit_rpcs_query(struct drm_i915_gem_object *obj,
|
||||
if (err)
|
||||
goto skip_request;
|
||||
|
||||
i915_gem_object_set_active_reference(batch->obj);
|
||||
i915_vma_unpin(batch);
|
||||
i915_vma_close(batch);
|
||||
i915_vma_put(batch);
|
||||
|
||||
i915_vma_unpin(vma);
|
||||
|
||||
@@ -820,6 +820,7 @@ err_request:
|
||||
i915_request_add(rq);
|
||||
err_batch:
|
||||
i915_vma_unpin(batch);
|
||||
i915_vma_put(batch);
|
||||
err_vma:
|
||||
i915_vma_unpin(vma);
|
||||
|
||||
@@ -1365,9 +1366,9 @@ static int write_to_scratch(struct i915_gem_context *ctx,
|
||||
if (err)
|
||||
goto skip_request;
|
||||
|
||||
i915_gem_object_set_active_reference(obj);
|
||||
i915_vma_unpin(vma);
|
||||
i915_vma_close(vma);
|
||||
i915_vma_put(vma);
|
||||
|
||||
i915_request_add(rq);
|
||||
|
||||
|
@@ -354,8 +354,8 @@ static int make_obj_busy(struct drm_i915_gem_object *obj)
|
||||
|
||||
i915_request_add(rq);
|
||||
|
||||
__i915_gem_object_release_unless_active(obj);
|
||||
i915_vma_unpin(vma);
|
||||
i915_gem_object_put(obj); /* leave it only alive via its active ref */
|
||||
|
||||
return err;
|
||||
}
|
||||
|
新しいイシューから参照
ユーザーをブロックする