All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chris Wilson <chris@chris-wilson.co.uk>
To: intel-gfx@lists.freedesktop.org
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Subject: [Intel-gfx] [PATCH 06/22] drm/i915/gt: Track signaled breadcrumbs outside of the breadcrumb spinlock
Date: Thu,  5 Nov 2020 10:11:18 +0000	[thread overview]
Message-ID: <20201105101134.19716-6-chris@chris-wilson.co.uk> (raw)
In-Reply-To: <20201105101134.19716-1-chris@chris-wilson.co.uk>

Make b->signaled_requests a lockless-list so that we can manipulate it
outside of the b->irq_lock.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
---
 drivers/gpu/drm/i915/gt/intel_breadcrumbs.c   | 34 ++++++++++++-------
 .../gpu/drm/i915/gt/intel_breadcrumbs_types.h |  2 +-
 drivers/gpu/drm/i915/i915_request.h           |  6 +++-
 3 files changed, 28 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
index 8d85683314e1..43cfabb102ea 100644
--- a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
+++ b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
@@ -173,26 +173,34 @@ static void add_retire(struct intel_breadcrumbs *b, struct intel_timeline *tl)
 		intel_engine_add_retire(b->irq_engine, tl);
 }
 
-static bool __signal_request(struct i915_request *rq, struct list_head *signals)
+static bool __signal_request(struct i915_request *rq)
 {
-	clear_bit(I915_FENCE_FLAG_SIGNAL, &rq->fence.flags);
-
 	if (!__dma_fence_signal(&rq->fence)) {
 		i915_request_put(rq);
 		return false;
 	}
 
-	list_add_tail(&rq->signal_link, signals);
 	return true;
 }
 
+static struct llist_node *
+slist_add(struct llist_node *node, struct llist_node *head)
+{
+	node->next = head;
+	return node;
+}
+
 static void signal_irq_work(struct irq_work *work)
 {
 	struct intel_breadcrumbs *b = container_of(work, typeof(*b), irq_work);
 	const ktime_t timestamp = ktime_get();
+	struct llist_node *signal, *sn;
 	struct intel_context *ce, *cn;
 	struct list_head *pos, *next;
-	LIST_HEAD(signal);
+
+	signal = NULL;
+	if (unlikely(!llist_empty(&b->signaled_requests)))
+		signal = llist_del_all(&b->signaled_requests);
 
 	spin_lock(&b->irq_lock);
 
@@ -224,8 +232,6 @@ static void signal_irq_work(struct irq_work *work)
 	if (b->irq_armed && list_empty(&b->signalers))
 		__intel_breadcrumbs_disarm_irq(b);
 
-	list_splice_init(&b->signaled_requests, &signal);
-
 	list_for_each_entry_safe(ce, cn, &b->signalers, signal_link) {
 		GEM_BUG_ON(list_empty(&ce->signals));
 
@@ -242,7 +248,10 @@ static void signal_irq_work(struct irq_work *work)
 			 * spinlock as the callback chain may end up adding
 			 * more signalers to the same context or engine.
 			 */
-			__signal_request(rq, &signal);
+			clear_bit(I915_FENCE_FLAG_SIGNAL, &rq->fence.flags);
+			if (__signal_request(rq))
+				/* We own signal_node now, xfer to local list */
+				signal = slist_add(&rq->signal_node, signal);
 		}
 
 		/*
@@ -262,9 +271,9 @@ static void signal_irq_work(struct irq_work *work)
 
 	spin_unlock(&b->irq_lock);
 
-	list_for_each_safe(pos, next, &signal) {
+	llist_for_each_safe(signal, sn, signal) {
 		struct i915_request *rq =
-			list_entry(pos, typeof(*rq), signal_link);
+			llist_entry(signal, typeof(*rq), signal_node);
 		struct list_head cb_list;
 
 		spin_lock(&rq->lock);
@@ -291,7 +300,7 @@ intel_breadcrumbs_create(struct intel_engine_cs *irq_engine)
 
 	spin_lock_init(&b->irq_lock);
 	INIT_LIST_HEAD(&b->signalers);
-	INIT_LIST_HEAD(&b->signaled_requests);
+	init_llist_head(&b->signaled_requests);
 
 	init_irq_work(&b->irq_work, signal_irq_work);
 
@@ -355,7 +364,8 @@ static void insert_breadcrumb(struct i915_request *rq,
 	 * its signal completion.
 	 */
 	if (__request_completed(rq)) {
-		if (__signal_request(rq, &b->signaled_requests))
+		if (__signal_request(rq) &&
+		    llist_add(&rq->signal_node, &b->signaled_requests))
 			irq_work_queue(&b->irq_work);
 		return;
 	}
diff --git a/drivers/gpu/drm/i915/gt/intel_breadcrumbs_types.h b/drivers/gpu/drm/i915/gt/intel_breadcrumbs_types.h
index 8e53b9942695..3fa19820b37a 100644
--- a/drivers/gpu/drm/i915/gt/intel_breadcrumbs_types.h
+++ b/drivers/gpu/drm/i915/gt/intel_breadcrumbs_types.h
@@ -35,7 +35,7 @@ struct intel_breadcrumbs {
 	struct intel_engine_cs *irq_engine;
 
 	struct list_head signalers;
-	struct list_head signaled_requests;
+	struct llist_head signaled_requests;
 
 	struct irq_work irq_work; /* for use from inside irq_lock */
 
diff --git a/drivers/gpu/drm/i915/i915_request.h b/drivers/gpu/drm/i915/i915_request.h
index 16b721080195..874af6db6103 100644
--- a/drivers/gpu/drm/i915/i915_request.h
+++ b/drivers/gpu/drm/i915/i915_request.h
@@ -176,7 +176,11 @@ struct i915_request {
 	struct intel_context *context;
 	struct intel_ring *ring;
 	struct intel_timeline __rcu *timeline;
-	struct list_head signal_link;
+
+	union {
+		struct list_head signal_link;
+		struct llist_node signal_node;
+	};
 
 	/*
 	 * The rcu epoch of when this request was allocated. Used to judiciously
-- 
2.20.1

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

  parent reply	other threads:[~2020-11-05 10:12 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-05 10:11 [Intel-gfx] [PATCH 01/22] drm/i915/gem: Allow backends to override pread implementation Chris Wilson
2020-11-05 10:11 ` [Intel-gfx] [PATCH 02/22] drm/i915/gem: Pull phys pread/pwrite implementations to the backend Chris Wilson
2020-11-05 15:39   ` Matthew Auld
2020-11-05 15:40     ` Matthew Auld
2020-11-05 15:45       ` Chris Wilson
2020-11-05 16:02         ` Matthew Auld
2020-11-05 16:19           ` Chris Wilson
2020-11-05 10:11 ` [PATCH 03/22] drm/i915/gt: Limit VFE threads based on GT Chris Wilson
2020-11-05 10:11   ` [Intel-gfx] " Chris Wilson
2020-11-05 10:11 ` [Intel-gfx] [PATCH 04/22] drm/i915/gt: Ignore dt==0 for reporting underflows Chris Wilson
2020-11-05 10:11 ` [Intel-gfx] [PATCH 05/22] drm/i915/gt: Defer enabling the breadcrumb interrupt to after submission Chris Wilson
2020-11-05 10:11 ` Chris Wilson [this message]
2020-11-05 10:11 ` [Intel-gfx] [PATCH 07/22] drm/i915/gt: Don't cancel the interrupt shadow too early Chris Wilson
2020-11-05 10:11 ` [Intel-gfx] [PATCH 08/22] drm/i915/gt: Free stale request on destroying the virtual engine Chris Wilson
2020-11-05 10:11 ` [Intel-gfx] [PATCH 09/22] drm/i915/gt: Protect context lifetime with RCU Chris Wilson
2020-11-05 10:11 ` [Intel-gfx] [PATCH 10/22] drm/i915/gt: Split the breadcrumb spinlock between global and contexts Chris Wilson
2020-11-05 10:11 ` [Intel-gfx] [PATCH 11/22] drm/i915/gt: Move the breadcrumb to the signaler if completed upon cancel Chris Wilson
2020-11-05 10:11 ` [Intel-gfx] [PATCH 12/22] drm/i915/gt: Decouple completed requests on unwind Chris Wilson
2020-11-05 10:11 ` [Intel-gfx] [PATCH 13/22] drm/i915/gt: Check for a completed last request once Chris Wilson
2020-11-05 10:11 ` [Intel-gfx] [PATCH 14/22] drm/i915/gt: Replace direct submit with direct call to tasklet Chris Wilson
2020-11-05 10:11 ` [Intel-gfx] [PATCH 15/22] drm/i915/gt: ce->inflight updates are now serialised Chris Wilson
2020-11-05 10:11 ` [Intel-gfx] [PATCH 16/22] drm/i915/gt: Use virtual_engine during execlists_dequeue Chris Wilson
2020-11-05 10:11 ` [Intel-gfx] [PATCH 17/22] drm/i915/gt: Decouple inflight virtual engines Chris Wilson
2020-11-05 10:11 ` [Intel-gfx] [PATCH 18/22] drm/i915/gt: Defer schedule_out until after the next dequeue Chris Wilson
2020-11-05 10:11 ` [Intel-gfx] [PATCH 19/22] drm/i915/gt: Remove virtual breadcrumb before transfer Chris Wilson
2020-11-05 10:11 ` [Intel-gfx] [PATCH 20/22] drm/i915/gt: Shrink the critical section for irq signaling Chris Wilson
2020-11-05 10:11 ` [Intel-gfx] [PATCH 21/22] drm/i915/gt: Resubmit the virtual engine on schedule-out Chris Wilson
2020-11-05 10:11 ` [Intel-gfx] [PATCH 22/22] drm/i915/gt: Simplify virtual engine handling for execlists_hold() Chris Wilson
2020-11-05 13:09 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for series starting with [01/22] drm/i915/gem: Allow backends to override pread implementation Patchwork
2020-11-05 13:38 ` [Intel-gfx] ✓ Fi.CI.BAT: success " 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=20201105101134.19716-6-chris@chris-wilson.co.uk \
    --to=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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.