[Intel-gfx] [PATCH] drm/i915/guc: Make wq_lock irq-safe

Chris Wilson chris at chris-wilson.co.uk
Tue Feb 28 09:21:06 UTC 2017


On Tue, Feb 28, 2017 at 08:58:18AM +0000, Tvrtko Ursulin wrote:
> 
> On 28/02/2017 08:47, Chris Wilson wrote:
> >Following the use of dma_fence_signal() from within our interrupt
> >handler, we need to make guc->wq_lock also irq-safe. This was done
> >previously as part of the guc scheduler patch (which also started
> >mixing our fences with the interrupt handler), but is now required to
> >fix the current guc submission backend.
> 
> Doh! :)
> 
> >Fixes: 67b807a89230 ("drm/i915: Delay disabling the user interrupt for
> >breadcrumbs")
> >Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> >Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> >Cc: Mika Kuoppala <mika.kuoppala at linux.intel.com>
> >---
> > drivers/gpu/drm/i915/i915_guc_submission.c | 14 ++++++++++----
> > 1 file changed, 10 insertions(+), 4 deletions(-)
> >
> >diff --git a/drivers/gpu/drm/i915/i915_guc_submission.c b/drivers/gpu/drm/i915/i915_guc_submission.c
> >index beec88a30347..c49cb5c8e975 100644
> >--- a/drivers/gpu/drm/i915/i915_guc_submission.c
> >+++ b/drivers/gpu/drm/i915/i915_guc_submission.c
> >@@ -348,7 +348,7 @@ int i915_guc_wq_reserve(struct drm_i915_gem_request *request)
> > 	u32 freespace;
> > 	int ret;
> >
> >-	spin_lock(&client->wq_lock);
> >+	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)) {
> >@@ -358,7 +358,7 @@ int i915_guc_wq_reserve(struct drm_i915_gem_request *request)
> > 		client->no_wq_space++;
> > 		ret = -EAGAIN;
> > 	}
> >-	spin_unlock(&client->wq_lock);
> >+	spin_unlock_irq(&client->wq_lock);
> >
> > 	return ret;
> > }
> >@@ -370,9 +370,9 @@ void i915_guc_wq_unreserve(struct drm_i915_gem_request *request)
> >
> > 	GEM_BUG_ON(READ_ONCE(client->wq_rsvd) < wqi_size);
> >
> >-	spin_lock(&client->wq_lock);
> >+	spin_lock_irq(&client->wq_lock);
> > 	client->wq_rsvd -= wqi_size;
> >-	spin_unlock(&client->wq_lock);
> >+	spin_unlock_irq(&client->wq_lock);
> > }
> 
> __i915_guc_submit would need irqsave as well since it is called from
> the signal callback.

Hmm, this was guc unreserve, and can be just spin_lock_irq.
__i915_guc_submit is always called with irq disabled.
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre


More information about the Intel-gfx mailing list