From: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
To: Chris Wilson <chris@chris-wilson.co.uk>, intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 14/15] drm/i915/guc: Keep the execbuf client allocated across reset
Date: Mon, 28 Nov 2016 13:49:03 +0000 [thread overview]
Message-ID: <374f5898-6f14-00a7-2af3-3fdc2d06ac7a@linux.intel.com> (raw)
In-Reply-To: <20161125093057.18491-15-chris@chris-wilson.co.uk>
On 25/11/2016 09:30, Chris Wilson wrote:
> In order to avoid some complexity in trying to reconstruct the
> workqueues across reset, remember them instead. The issue comes when we
> have to handle a reset between request allocation and submission, the
> request has reserved space in the wq, but is not in any list so we fail
> to restore the reserved space. By keeping the execbuf client intact
> across the reset, we also keep the reservations.
I lost track a bit on why do we need to reserve the space at request
creation time? Is it not becoming a bit cumbersome?
>
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> ---
> drivers/gpu/drm/i915/i915_guc_submission.c | 83 +++++++++++++++++++-----------
> 1 file changed, 52 insertions(+), 31 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_guc_submission.c b/drivers/gpu/drm/i915/i915_guc_submission.c
> index 800dc5bb732f..00b5fa871644 100644
> --- a/drivers/gpu/drm/i915/i915_guc_submission.c
> +++ b/drivers/gpu/drm/i915/i915_guc_submission.c
> @@ -252,13 +252,6 @@ static int guc_update_doorbell_id(struct intel_guc *guc,
> return host2guc_allocate_doorbell(guc, client);
> }
>
> -static int guc_init_doorbell(struct intel_guc *guc,
> - struct i915_guc_client *client,
> - uint16_t db_id)
> -{
> - return guc_update_doorbell_id(guc, client, db_id);
> -}
> -
> static void guc_disable_doorbell(struct intel_guc *guc,
> struct i915_guc_client *client)
> {
> @@ -779,8 +772,7 @@ static void guc_init_doorbell_hw(struct intel_guc *guc)
> uint16_t db_id;
> int i, err;
>
> - /* Save client's original doorbell selection */
> - db_id = client->doorbell_id;
> + guc_disable_doorbell(guc, client);
>
> for (i = 0; i < GUC_MAX_DOORBELLS; ++i) {
> /* Skip if doorbell is OK */
> @@ -793,7 +785,9 @@ static void guc_init_doorbell_hw(struct intel_guc *guc)
> i, err);
> }
>
> - /* Restore to original value */
> + db_id = select_doorbell_register(guc, client->priority);
> + WARN_ON(db_id == GUC_INVALID_DOORBELL_ID);
> +
> err = guc_update_doorbell_id(guc, client, db_id);
> if (err)
> DRM_WARN("Failed to restore doorbell to %d, err %d\n",
> @@ -883,8 +877,13 @@ guc_client_alloc(struct drm_i915_private *dev_priv,
>
> guc_proc_desc_init(guc, client);
> guc_ctx_desc_init(guc, client);
> - if (guc_init_doorbell(guc, client, db_id))
> - goto err;
> +
> + /* For runtime client allocation we need to enable the doorbell. Not
> + * required yet for the static execbuf_client as this special kernel
> + * client is enabled from i915_guc_submission_enable().
> + *
> + * guc_update_doorbell_id(guc, client, db_id);
> + */
What future is the "not yet" part referring to? What are the other clients?
>
> DRM_DEBUG_DRIVER("new priority %u client %p for engine(s) 0x%x: ctx_index %u\n",
> priority, client, client->engines, client->ctx_index);
> @@ -1484,6 +1483,9 @@ int i915_guc_submission_init(struct drm_i915_private *dev_priv)
> struct intel_guc *guc = &dev_priv->guc;
> struct i915_vma *vma;
>
> + if (!HAS_GUC_SCHED(dev_priv))
> + return 0;
Why did you have to add this hunk? I think this function does not get
called unless there is a GuC.
> +
> /* Wipe bitmap & delete client in case of reinitialisation */
> bitmap_clear(guc->doorbell_bitmap, 0, GUC_MAX_DOORBELLS);
> i915_guc_submission_disable(dev_priv);
> @@ -1504,42 +1506,57 @@ int i915_guc_submission_init(struct drm_i915_private *dev_priv)
> guc_log_create(guc);
> guc_addon_create(guc);
>
> + guc->execbuf_client = guc_client_alloc(dev_priv,
> + INTEL_INFO(dev_priv)->ring_mask,
> + GUC_CTX_PRIORITY_KMD_NORMAL,
> + dev_priv->kernel_context);
> + if (!guc->execbuf_client) {
> + DRM_ERROR("Failed to create GuC client for execbuf!\n");
> + goto err;
> + }
> +
> return 0;
> +
> +err:
> + i915_guc_submission_fini(dev_priv);
> + return -ENOMEM;
> +}
> +
> +static void guc_reset_wq(struct i915_guc_client *gc)
> +{
> + struct guc_process_desc *desc = gc->vaddr + gc->proc_desc_offset;
> +
> + desc->head = 0;
> + desc->tail = 0;
> +
> + gc->wq_tail = 0;
> }
>
> int i915_guc_submission_enable(struct drm_i915_private *dev_priv)
> {
> struct intel_guc *guc = &dev_priv->guc;
> - struct drm_i915_gem_request *request;
> - struct i915_guc_client *client;
> + struct i915_guc_client *client = guc->execbuf_client;
> struct intel_engine_cs *engine;
> enum intel_engine_id id;
>
> - /* client for execbuf submission */
> - client = guc_client_alloc(dev_priv,
> - INTEL_INFO(dev_priv)->ring_mask,
> - GUC_CTX_PRIORITY_KMD_NORMAL,
> - dev_priv->kernel_context);
> - if (!client) {
> - DRM_ERROR("Failed to create normal GuC client!\n");
> - return -ENOMEM;
> - }
> + if (!client)
> + return -ENODEV;
>
> - guc->execbuf_client = client;
> + guc_reset_wq(client);
> host2guc_sample_forcewake(guc, client);
> guc_init_doorbell_hw(guc);
>
> /* Take over from manual control of ELSP (execlists) */
> for_each_engine(engine, dev_priv, id) {
> + struct drm_i915_gem_request *rq;
> +
> engine->submit_request = i915_guc_submit;
> engine->schedule = NULL;
>
> /* Replay the current set of previously submitted requests */
> - list_for_each_entry(request,
> - &engine->timeline->requests, link) {
> + list_for_each_entry(rq, &engine->timeline->requests, link) {
> client->wq_rsvd += sizeof(struct guc_wq_item);
> - if (i915_sw_fence_done(&request->submit))
> - i915_guc_submit(request);
i915_sw_fence_done check is not needed because only submit-ready
requests can be on the engine timeline?
> + i915_guc_submit(rq);
> }
> }
>
> @@ -1555,14 +1572,18 @@ void i915_guc_submission_disable(struct drm_i915_private *dev_priv)
>
> /* Revert back to manual ELSP submission */
> intel_execlists_enable_submission(dev_priv);
> -
> - guc_client_free(dev_priv, guc->execbuf_client);
> - guc->execbuf_client = NULL;
> }
>
> void i915_guc_submission_fini(struct drm_i915_private *dev_priv)
> {
> struct intel_guc *guc = &dev_priv->guc;
> + struct i915_guc_client *client;
> +
> + client = fetch_and_zero(&guc->execbuf_client);
> + if (!client)
> + return;
> +
> + guc_client_free(dev_priv, client);
>
> i915_vma_unpin_and_release(&guc->ads_vma);
> i915_vma_unpin_and_release(&guc->log.vma);
>
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:[~2016-11-28 13:49 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-11-25 9:30 GuC vs multiple timelines Chris Wilson
2016-11-25 9:30 ` [PATCH 01/15] drm: Hold mode_config.lock to prevent hotplug whilst setting up crtcs Chris Wilson
2016-11-25 9:30 ` [PATCH 02/15] drm: Pull together probe + setup for drm_fb_helper Chris Wilson
2016-11-25 9:30 ` [PATCH 03/15] drm: Protect fb_helper list manipulation with a mutex Chris Wilson
2016-11-25 9:30 ` [PATCH 04/15] drm/i915/perf: Wrap 64bit divides in do_div() Chris Wilson
2016-11-25 9:30 ` [PATCH 05/15] drm/i915: Add is-completed assert to request retire entrypoint Chris Wilson
2016-11-25 10:36 ` Joonas Lahtinen
2016-11-25 9:30 ` [PATCH 06/15] drm/i915: Assert no external observers when unwind a failed request alloc Chris Wilson
2016-11-25 10:39 ` Joonas Lahtinen
2016-11-25 11:27 ` Chris Wilson
2016-11-25 9:30 ` [PATCH 07/15] drm/i915: Hold a reference on the request for its fence chain Chris Wilson
2016-11-25 10:31 ` Joonas Lahtinen
2016-11-25 10:46 ` Chris Wilson
2016-11-25 9:30 ` [PATCH 08/15] drm/i915: Integrate i915_sw_fence with debugobjects Chris Wilson
2016-11-25 10:24 ` Joonas Lahtinen
2016-11-25 9:30 ` [PATCH 09/15] drm/i915: Enable swfence debugobject support for i915.ko Chris Wilson
2016-11-25 10:32 ` Joonas Lahtinen
2016-11-25 9:30 ` [PATCH 10/15] HAX drm/i915: Enable guc submission Chris Wilson
2016-11-25 9:30 ` [PATCH 11/15] drm/i915: Trim i915_guc_info() stack usage Chris Wilson
2016-11-28 11:15 ` Tvrtko Ursulin
2016-11-28 11:35 ` Chris Wilson
2016-11-28 12:17 ` Tvrtko Ursulin
2016-11-25 9:30 ` [PATCH 12/15] drm/i915/guc: Rename client->cookie to match use Chris Wilson
2016-11-28 11:37 ` Tvrtko Ursulin
2016-11-25 9:30 ` [PATCH 13/15] drm/i915/guc: Initialise doorbell cookie to matching value Chris Wilson
2016-11-28 12:09 ` Tvrtko Ursulin
2016-11-28 12:18 ` Chris Wilson
2016-11-25 9:30 ` [PATCH 14/15] drm/i915/guc: Keep the execbuf client allocated across reset Chris Wilson
2016-11-28 13:49 ` Tvrtko Ursulin [this message]
2016-11-28 14:11 ` Chris Wilson
2016-11-28 15:44 ` Tvrtko Ursulin
2016-11-28 16:01 ` Chris Wilson
2016-11-25 9:30 ` [PATCH 15/15] drm/i915/guc: Split hw submission for replay after GPU reset Chris Wilson
2016-11-28 14:02 ` Tvrtko Ursulin
2016-11-28 14:19 ` Chris Wilson
2016-11-28 15:20 ` Mika Kuoppala
2016-11-28 15:55 ` Tvrtko Ursulin
2016-11-28 16:06 ` Chris Wilson
2016-11-25 10:16 ` ✗ Fi.CI.BAT: warning for series starting with [01/15] drm: Hold mode_config.lock to prevent hotplug whilst setting up crtcs 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=374f5898-6f14-00a7-2af3-3fdc2d06ac7a@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