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
next prev parent 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