[Intel-gfx] [PATCH 1/2] drm/i915: Serialise with remote retirement
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Wed Nov 20 16:05:24 UTC 2019
On 20/11/2019 15:21, Chris Wilson wrote:
> Since retirement may be running in a worker on another CPU, it may be
> skipped in the local intel_gt_wait_for_idle(). To ensure the state is
> consistent for our sanity checks upon load, serialise with the remote
> retirer by waiting on the timeline->mutex.
What may get skipped? Timeline might have been removed from the active
list before wait_for_idle? But why would that be bad for this code? It
just splits part of the retirement to two paths - wait_for_idle still...
oops wait.. indeed.. wait_for_idle used to guarantee retirement and now
it can be ongoing. Does wait_for_idle needs to always wait or you think
case-by-case basis is better?
Regards,
Tvrtko
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> ---
> drivers/gpu/drm/i915/i915_gem.c | 26 +++++++++++++++++++++++---
> 1 file changed, 23 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 1ba5f26700b0..61395b03443e 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -45,6 +45,7 @@
> #include "gem/i915_gem_context.h"
> #include "gem/i915_gem_ioctls.h"
> #include "gem/i915_gem_pm.h"
> +#include "gt/intel_context.h"
> #include "gt/intel_engine_user.h"
> #include "gt/intel_gt.h"
> #include "gt/intel_gt_pm.h"
> @@ -1041,6 +1042,18 @@ i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
> return err;
> }
>
> +static int __intel_context_flush_retire(struct intel_context *ce)
> +{
> + struct intel_timeline *tl;
> +
> + tl = intel_context_timeline_lock(ce);
> + if (IS_ERR(tl))
> + return PTR_ERR(tl);
> +
> + intel_context_timeline_unlock(tl);
> + return 0;
> +}
> +
> static int __intel_engines_record_defaults(struct intel_gt *gt)
> {
> struct i915_request *requests[I915_NUM_ENGINES] = {};
> @@ -1109,13 +1122,20 @@ static int __intel_engines_record_defaults(struct intel_gt *gt)
> if (!rq)
> continue;
>
> - /* We want to be able to unbind the state from the GGTT */
> - GEM_BUG_ON(intel_context_is_pinned(rq->hw_context));
> -
> + GEM_BUG_ON(!test_bit(CONTEXT_ALLOC_BIT,
> + &rq->hw_context->flags));
> state = rq->hw_context->state;
> if (!state)
> continue;
>
> + /* Serialise with retirement on another CPU */
> + err = __intel_context_flush_retire(rq->hw_context);
> + if (err)
> + goto out;
> +
> + /* We want to be able to unbind the state from the GGTT */
> + GEM_BUG_ON(intel_context_is_pinned(rq->hw_context));
> +
> /*
> * As we will hold a reference to the logical state, it will
> * not be torn down with the context, and importantly the
>
More information about the Intel-gfx
mailing list