Now that we have an upper bound on the number of work items being sent
to GuC, we can remove the reservation.

Cc: Chris Wilson <[email protected]>
Cc: Daniele Ceraolo Spurio <[email protected]>
Cc: Michal Wajdeczko <[email protected]>
Cc: Oscar Mateo <[email protected]>
Signed-off-by: Michał Winiarski <[email protected]>
---
 drivers/gpu/drm/i915/i915_debugfs.c        |  1 -
 drivers/gpu/drm/i915/i915_guc_submission.c | 82 +++---------------------------
 drivers/gpu/drm/i915/intel_lrc.c           | 25 ++-------
 drivers/gpu/drm/i915/intel_uc.h            |  8 ---
 4 files changed, 10 insertions(+), 106 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
b/drivers/gpu/drm/i915/i915_debugfs.c
index 8abb939..19818da 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -2481,7 +2481,6 @@ static void i915_guc_client_info(struct seq_file *m,
        seq_printf(m, "\tWQ size %d, offset: 0x%x, tail %d\n",
                client->wq_size, client->wq_offset, client->wq_tail);
 
-       seq_printf(m, "\tWork queue full: %u\n", client->no_wq_space);
        seq_printf(m, "\tFailed doorbell: %u\n", client->b_fail);
        seq_printf(m, "\tLast submission result: %d\n", client->retcode);
 
diff --git a/drivers/gpu/drm/i915/i915_guc_submission.c 
b/drivers/gpu/drm/i915/i915_guc_submission.c
index a930b03..4c853fb7 100644
--- a/drivers/gpu/drm/i915/i915_guc_submission.c
+++ b/drivers/gpu/drm/i915/i915_guc_submission.c
@@ -406,63 +406,6 @@ static void guc_stage_desc_fini(struct intel_guc *guc,
        memset(desc, 0, sizeof(*desc));
 }
 
-/**
- * i915_guc_wq_reserve() - reserve space in the GuC's workqueue
- * @request:   request associated with the commands
- *
- * Return:     0 if space is available
- *             -EAGAIN if space is not currently available
- *
- * This function must be called (and must return 0) before a request
- * is submitted to the GuC via i915_guc_submit() below. Once a result
- * of 0 has been returned, it must be balanced by a corresponding
- * call to submit().
- *
- * Reservation allows the caller to determine in advance that space
- * will be available for the next submission before committing resources
- * to it, and helps avoid late failures with complicated recovery paths.
- */
-int i915_guc_wq_reserve(struct drm_i915_gem_request *request)
-{
-       const size_t wqi_size = sizeof(struct guc_wq_item);
-       struct i915_guc_client *client = request->i915->guc.execbuf_client;
-       struct guc_process_desc *desc = __get_process_desc(client);
-       u32 freespace;
-       int ret;
-
-       spin_lock_irq(&client->wq_lock);
-       freespace = CIRC_SPACE(client->wq_tail, desc->head, client->wq_size);
-       freespace -= client->wq_rsvd;
-       if (likely(freespace >= wqi_size)) {
-               client->wq_rsvd += wqi_size;
-               ret = 0;
-       } else {
-               client->no_wq_space++;
-               ret = -EAGAIN;
-       }
-       spin_unlock_irq(&client->wq_lock);
-
-       return ret;
-}
-
-static void guc_client_update_wq_rsvd(struct i915_guc_client *client, int size)
-{
-       unsigned long flags;
-
-       spin_lock_irqsave(&client->wq_lock, flags);
-       client->wq_rsvd += size;
-       spin_unlock_irqrestore(&client->wq_lock, flags);
-}
-
-void i915_guc_wq_unreserve(struct drm_i915_gem_request *request)
-{
-       const int wqi_size = sizeof(struct guc_wq_item);
-       struct i915_guc_client *client = request->i915->guc.execbuf_client;
-
-       GEM_BUG_ON(READ_ONCE(client->wq_rsvd) < wqi_size);
-       guc_client_update_wq_rsvd(client, -wqi_size);
-}
-
 /* Construct a Work Item and append it to the GuC's Work Queue */
 static void guc_wq_item_append(struct i915_guc_client *client,
                               struct drm_i915_gem_request *rq)
@@ -475,7 +418,7 @@ static void guc_wq_item_append(struct i915_guc_client 
*client,
        struct guc_wq_item *wqi;
        u32 freespace, tail, wq_off;
 
-       /* Free space is guaranteed, see i915_guc_wq_reserve() above */
+       /* Free space is guaranteed */
        freespace = CIRC_SPACE(client->wq_tail, desc->head, client->wq_size);
        GEM_BUG_ON(freespace < wqi_size);
 
@@ -491,14 +434,12 @@ static void guc_wq_item_append(struct i915_guc_client 
*client,
         * workqueue buffer dw by dw.
         */
        BUILD_BUG_ON(wqi_size != 16);
-       GEM_BUG_ON(client->wq_rsvd < wqi_size);
 
        /* postincrement WQ tail for next time */
        wq_off = client->wq_tail;
        GEM_BUG_ON(wq_off & (wqi_size - 1));
        client->wq_tail += wqi_size;
        client->wq_tail &= client->wq_size - 1;
-       client->wq_rsvd -= wqi_size;
 
        /* WQ starts from the page after doorbell / process_desc */
        wqi = client->vaddr + wq_off + GUC_DB_SIZE;
@@ -583,14 +524,6 @@ static int guc_ring_doorbell(struct i915_guc_client 
*client)
  * i915_guc_submit() - Submit commands through GuC
  * @rq:                request associated with the commands
  *
- * The caller must have already called i915_guc_wq_reserve() above with
- * a result of 0 (success), guaranteeing that there is space in the work
- * queue for the new request, so enqueuing the item cannot fail.
- *
- * Bad Things Will Happen if the caller violates this protocol e.g. calls
- * submit() when _reserve() says there's no space, or calls _submit()
- * a different number of times from (successful) calls to _reserve().
- *
  * The only error here arises if the doorbell hardware isn't functioning
  * as expected, which really shouln't happen.
  */
@@ -601,14 +534,13 @@ static void i915_guc_submit(struct drm_i915_gem_request 
*rq)
        unsigned int engine_id = engine->id;
        struct intel_guc *guc = &rq->i915->guc;
        struct i915_guc_client *client = guc->execbuf_client;
-       unsigned long flags;
        int b_ret;
 
        /* WA to flush out the pending GMADR writes to ring buffer. */
        if (i915_vma_is_map_and_fenceable(rq->ring->vma))
                POSTING_READ_FW(GUC_STATUS);
 
-       spin_lock_irqsave(&client->wq_lock, flags);
+       spin_lock(&client->wq_lock);
 
        guc_wq_item_append(client, rq);
        b_ret = guc_ring_doorbell(client);
@@ -621,7 +553,7 @@ static void i915_guc_submit(struct drm_i915_gem_request *rq)
        guc->submissions[engine_id] += 1;
        guc->last_seqno[engine_id] = rq->global_seqno;
 
-       spin_unlock_irqrestore(&client->wq_lock, flags);
+       spin_unlock(&client->wq_lock);
 }
 
 static void nested_enable_signaling(struct drm_i915_gem_request *rq)
@@ -1223,6 +1155,9 @@ int i915_guc_submission_enable(struct drm_i915_private 
*dev_priv)
        enum intel_engine_id id;
        int err;
 
+       BUILD_BUG_ON(ARRAY_SIZE(engine->execlist_port) *
+                    sizeof(struct guc_wq_item) > GUC_WQ_SIZE);
+
        if (!client) {
                client = guc_client_alloc(dev_priv,
                                          INTEL_INFO(dev_priv)->ring_mask,
@@ -1250,7 +1185,6 @@ int i915_guc_submission_enable(struct drm_i915_private 
*dev_priv)
        guc_interrupts_capture(dev_priv);
 
        for_each_engine(engine, dev_priv, id) {
-               const int wqi_size = sizeof(struct guc_wq_item);
                struct drm_i915_gem_request *rq;
 
                /* The tasklet was initialised by execlists, and may be in
@@ -1263,10 +1197,8 @@ int i915_guc_submission_enable(struct drm_i915_private 
*dev_priv)
 
                /* Replay the current set of previously submitted requests */
                spin_lock_irq(&engine->timeline->lock);
-               list_for_each_entry(rq, &engine->timeline->requests, link) {
-                       guc_client_update_wq_rsvd(client, wqi_size);
+               list_for_each_entry(rq, &engine->timeline->requests, link)
                        i915_guc_submit(rq);
-               }
                spin_unlock_irq(&engine->timeline->lock);
        }
 
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index 014b30a..5d4f23c 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -913,27 +913,14 @@ static int execlists_request_alloc(struct 
drm_i915_gem_request *request)
         */
        request->reserved_space += EXECLISTS_REQUEST_SIZE;
 
-       if (i915.enable_guc_submission) {
-               /*
-                * Check that the GuC has space for the request before
-                * going any further, as the i915_add_request() call
-                * later on mustn't fail ...
-                */
-               ret = i915_guc_wq_reserve(request);
-               if (ret)
-                       goto err;
-       }
-
        cs = intel_ring_begin(request, 0);
-       if (IS_ERR(cs)) {
-               ret = PTR_ERR(cs);
-               goto err_unreserve;
-       }
+       if (IS_ERR(cs))
+               return PTR_ERR(cs);
 
        if (!ce->initialised) {
                ret = engine->init_context(request);
                if (ret)
-                       goto err_unreserve;
+                       return ret;
 
                ce->initialised = true;
        }
@@ -947,12 +934,6 @@ static int execlists_request_alloc(struct 
drm_i915_gem_request *request)
 
        request->reserved_space -= EXECLISTS_REQUEST_SIZE;
        return 0;
-
-err_unreserve:
-       if (i915.enable_guc_submission)
-               i915_guc_wq_unreserve(request);
-err:
-       return ret;
 }
 
 /*
diff --git a/drivers/gpu/drm/i915/intel_uc.h b/drivers/gpu/drm/i915/intel_uc.h
index 7618b71..903cf51 100644
--- a/drivers/gpu/drm/i915/intel_uc.h
+++ b/drivers/gpu/drm/i915/intel_uc.h
@@ -55,10 +55,6 @@ struct drm_i915_gem_request;
  *
  * We also keep a few statistics on failures. Ideally, these should all
  * be zero!
- *   no_wq_space: times that the submission pre-check found no space was
- *                available in the work queue (note, the queue is shared,
- *                not per-engine). It is OK for this to be nonzero, but
- *                it should not be huge!
  *   q_fail: failed to enqueue a work item. This should never happen,
  *           because we check for space beforehand.
  *   b_fail: failed to ring the doorbell. This should never happen, unless
@@ -85,8 +81,6 @@ struct i915_guc_client {
        uint32_t wq_offset;
        uint32_t wq_size;
        uint32_t wq_tail;
-       uint32_t wq_rsvd;
-       uint32_t no_wq_space;
        uint32_t b_fail;
        int retcode;
 
@@ -260,8 +254,6 @@ u32 intel_guc_wopcm_size(struct drm_i915_private *dev_priv);
 /* i915_guc_submission.c */
 int i915_guc_submission_init(struct drm_i915_private *dev_priv);
 int i915_guc_submission_enable(struct drm_i915_private *dev_priv);
-int i915_guc_wq_reserve(struct drm_i915_gem_request *rq);
-void i915_guc_wq_unreserve(struct drm_i915_gem_request *request);
 void i915_guc_submission_disable(struct drm_i915_private *dev_priv);
 void i915_guc_submission_fini(struct drm_i915_private *dev_priv);
 struct i915_vma *intel_guc_allocate_vma(struct intel_guc *guc, u32 size);
-- 
2.9.4

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to