public inbox for intel-gfx@lists.freedesktop.org
 help / color / mirror / Atom feed
From: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
To: Chris Wilson <chris@chris-wilson.co.uk>, intel-gfx@lists.freedesktop.org
Subject: Re: [Intel-gfx] [PATCH 09/16] drm/i915/gt: ce->inflight updates are now serialised
Date: Wed, 25 Nov 2020 09:34:23 +0000	[thread overview]
Message-ID: <e7cf94db-10f7-7705-d1d3-374e0f4f99fc@linux.intel.com> (raw)
In-Reply-To: <20201124114219.29020-9-chris@chris-wilson.co.uk>


On 24/11/2020 11:42, Chris Wilson wrote:
> Since schedule-in and schedule-out are now both always under the tasklet
> bitlock, we can reduce the individual atomic operations to simple
> instructions and worry less.
> 
> This notably eliminates the race observed with intel_context_inflight in
> __engine_unpark().
> 
> Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/2583
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> ---
>   drivers/gpu/drm/i915/gt/intel_lrc.c | 52 ++++++++++++++---------------
>   1 file changed, 25 insertions(+), 27 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
> index 49a80f940e73..3a6a9539b54e 100644
> --- a/drivers/gpu/drm/i915/gt/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
> @@ -1358,11 +1358,11 @@ __execlists_schedule_in(struct i915_request *rq)
>   		ce->lrc.ccid = ce->tag;
>   	} else {
>   		/* We don't need a strict matching tag, just different values */
> -		unsigned int tag = ffs(READ_ONCE(engine->context_tag));
> +		unsigned int tag = __ffs(engine->context_tag);
>   
> -		GEM_BUG_ON(tag == 0 || tag >= BITS_PER_LONG);
> -		clear_bit(tag - 1, &engine->context_tag);
> -		ce->lrc.ccid = tag << (GEN11_SW_CTX_ID_SHIFT - 32);
> +		GEM_BUG_ON(tag >= BITS_PER_LONG);
> +		__clear_bit(tag, &engine->context_tag);
> +		ce->lrc.ccid = (1 + tag) << (GEN11_SW_CTX_ID_SHIFT - 32);
>   
>   		BUILD_BUG_ON(BITS_PER_LONG > GEN12_MAX_CONTEXT_HW_ID);
>   	}
> @@ -1375,6 +1375,8 @@ __execlists_schedule_in(struct i915_request *rq)
>   	execlists_context_status_change(rq, INTEL_CONTEXT_SCHEDULE_IN);
>   	intel_engine_context_in(engine);
>   
> +	CE_TRACE(ce, "schedule-in, ccid:%x\n", ce->lrc.ccid);
> +
>   	return engine;
>   }
>   
> @@ -1386,13 +1388,10 @@ static inline void execlists_schedule_in(struct i915_request *rq, int idx)
>   	GEM_BUG_ON(!intel_engine_pm_is_awake(rq->engine));
>   	trace_i915_request_in(rq, idx);
>   
> -	old = READ_ONCE(ce->inflight);
> -	do {
> -		if (!old) {
> -			WRITE_ONCE(ce->inflight, __execlists_schedule_in(rq));
> -			break;
> -		}
> -	} while (!try_cmpxchg(&ce->inflight, &old, ptr_inc(old)));
> +	old = ce->inflight;
> +	if (!old)
> +		old = __execlists_schedule_in(rq);
> +	WRITE_ONCE(ce->inflight, ptr_inc(old));
>   
>   	GEM_BUG_ON(intel_context_inflight(ce) != rq->engine);
>   }
> @@ -1406,12 +1405,11 @@ static void kick_siblings(struct i915_request *rq, struct intel_context *ce)
>   		tasklet_hi_schedule(&ve->base.execlists.tasklet);
>   }
>   
> -static inline void
> -__execlists_schedule_out(struct i915_request *rq,
> -			 struct intel_engine_cs * const engine,
> -			 unsigned int ccid)
> +static inline void __execlists_schedule_out(struct i915_request *rq)
>   {
>   	struct intel_context * const ce = rq->context;
> +	struct intel_engine_cs * const engine = rq->engine;
> +	unsigned int ccid;
>   
>   	/*
>   	 * NB process_csb() is not under the engine->active.lock and hence
> @@ -1419,6 +1417,8 @@ __execlists_schedule_out(struct i915_request *rq,
>   	 * refrain from doing non-trivial work here.
>   	 */
>   
> +	CE_TRACE(ce, "schedule-out, ccid:%x\n", ce->lrc.ccid);
> +
>   	if (IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM))
>   		execlists_check_context(ce, engine, "after");
>   
> @@ -1430,12 +1430,13 @@ __execlists_schedule_out(struct i915_request *rq,
>   	    i915_request_completed(rq))
>   		intel_engine_add_retire(engine, ce->timeline);
>   
> +	ccid = ce->lrc.ccid;
>   	ccid >>= GEN11_SW_CTX_ID_SHIFT - 32;
>   	ccid &= GEN12_MAX_CONTEXT_HW_ID;
>   	if (ccid < BITS_PER_LONG) {
>   		GEM_BUG_ON(ccid == 0);
>   		GEM_BUG_ON(test_bit(ccid - 1, &engine->context_tag));
> -		set_bit(ccid - 1, &engine->context_tag);
> +		__set_bit(ccid - 1, &engine->context_tag);
>   	}
>   
>   	intel_context_update_runtime(ce);
> @@ -1456,26 +1457,23 @@ __execlists_schedule_out(struct i915_request *rq,
>   	 */
>   	if (ce->engine != engine)
>   		kick_siblings(rq, ce);
> -
> -	intel_context_put(ce);
>   }
>   
>   static inline void
>   execlists_schedule_out(struct i915_request *rq)
>   {
>   	struct intel_context * const ce = rq->context;
> -	struct intel_engine_cs *cur, *old;
> -	u32 ccid;
>   
>   	trace_i915_request_out(rq);
>   
> -	ccid = rq->context->lrc.ccid;
> -	old = READ_ONCE(ce->inflight);
> -	do
> -		cur = ptr_unmask_bits(old, 2) ? ptr_dec(old) : NULL;
> -	while (!try_cmpxchg(&ce->inflight, &old, cur));
> -	if (!cur)
> -		__execlists_schedule_out(rq, old, ccid);
> +	GEM_BUG_ON(!ce->inflight);
> +	ce->inflight = ptr_dec(ce->inflight);
> +	if (!intel_context_inflight_count(ce)) {
> +		GEM_BUG_ON(ce->inflight != rq->engine);
> +		__execlists_schedule_out(rq);
> +		WRITE_ONCE(ce->inflight, NULL);
> +		intel_context_put(ce);
> +	}
>   
>   	i915_request_put(rq);
>   }
> 

Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

Regards,

Tvrtko
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2020-11-25  9:34 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-24 11:42 [Intel-gfx] [PATCH 01/16] drm/i915/gem: Drop free_work for GEM contexts Chris Wilson
2020-11-24 11:42 ` [Intel-gfx] [PATCH 02/16] drm/i915/gt: Track the overall awake/busy time Chris Wilson
2020-11-24 11:42 ` [Intel-gfx] [PATCH 03/16] drm/i915/gt: Protect context lifetime with RCU Chris Wilson
2020-11-24 11:42 ` [Intel-gfx] [PATCH 04/16] drm/i915/gt: Split the breadcrumb spinlock between global and contexts Chris Wilson
2020-11-24 11:42 ` [Intel-gfx] [PATCH 05/16] drm/i915/gt: Move the breadcrumb to the signaler if completed upon cancel Chris Wilson
2020-11-24 16:19   ` Tvrtko Ursulin
2020-11-24 16:30     ` Chris Wilson
2020-11-24 17:02       ` Tvrtko Ursulin
2020-11-25 19:56   ` [Intel-gfx] [PATCH v2] " Chris Wilson
2020-11-26 11:32     ` Tvrtko Ursulin
2020-11-24 11:42 ` [Intel-gfx] [PATCH 06/16] drm/i915/gt: Decouple completed requests on unwind Chris Wilson
2020-11-24 17:13   ` Tvrtko Ursulin
2020-11-24 17:31     ` Chris Wilson
2020-11-25  9:15       ` Tvrtko Ursulin
2020-11-25 10:21         ` Chris Wilson
2020-11-25 16:21           ` Tvrtko Ursulin
2020-11-24 11:42 ` [Intel-gfx] [PATCH 07/16] drm/i915/gt: Check for a completed last request once Chris Wilson
2020-11-24 17:19   ` Tvrtko Ursulin
2020-11-24 17:38     ` Chris Wilson
2020-11-25  8:59       ` Tvrtko Ursulin
2020-11-24 11:42 ` [Intel-gfx] [PATCH 08/16] drm/i915/gt: Replace direct submit with direct call to tasklet Chris Wilson
2020-11-24 11:42 ` [Intel-gfx] [PATCH 09/16] drm/i915/gt: ce->inflight updates are now serialised Chris Wilson
2020-11-25  9:34   ` Tvrtko Ursulin [this message]
2020-11-24 11:42 ` [Intel-gfx] [PATCH 10/16] drm/i915/gt: Use virtual_engine during execlists_dequeue Chris Wilson
2020-11-24 11:42 ` [Intel-gfx] [PATCH 11/16] drm/i915/gt: Decouple inflight virtual engines Chris Wilson
2020-11-24 11:42 ` [Intel-gfx] [PATCH 12/16] drm/i915/gt: Defer schedule_out until after the next dequeue Chris Wilson
2020-11-24 11:42 ` [Intel-gfx] [PATCH 13/16] drm/i915/gt: Remove virtual breadcrumb before transfer Chris Wilson
2020-11-24 11:42 ` [Intel-gfx] [PATCH 14/16] drm/i915/gt: Shrink the critical section for irq signaling Chris Wilson
2020-11-24 11:42 ` [Intel-gfx] [PATCH 15/16] drm/i915/gt: Resubmit the virtual engine on schedule-out Chris Wilson
2020-11-24 11:42 ` [Intel-gfx] [PATCH 16/16] drm/i915/gt: Simplify virtual engine handling for execlists_hold() Chris Wilson
2020-11-24 14:15 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for series starting with [01/16] drm/i915/gem: Drop free_work for GEM contexts Patchwork
2020-11-24 14:16 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2020-11-24 14:45 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2020-11-24 18:04 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork
2020-11-25 21:02 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for series starting with [01/16] drm/i915/gem: Drop free_work for GEM contexts (rev2) Patchwork
2020-11-25 21:04 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2020-11-25 21:32 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2020-11-25 23:34 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e7cf94db-10f7-7705-d1d3-374e0f4f99fc@linux.intel.com \
    --to=tvrtko.ursulin@linux.intel.com \
    --cc=chris@chris-wilson.co.uk \
    --cc=intel-gfx@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox