diff mbox

[44/55] drm/i915: Track requests inside each intel_ring

Message ID 1469467954-3920-45-git-send-email-chris@chris-wilson.co.uk (mailing list archive)
State New, archived
Headers show

Commit Message

Chris Wilson July 25, 2016, 5:32 p.m. UTC
By tracking each request occupying space inside an individual
intel_ring, we can greatly simplify the logic of tracking available
space and not worry about other timelines. (Each ring is an ordered
timeline of committed requests.)

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/i915_gem_request.c |  2 ++
 drivers/gpu/drm/i915/i915_gem_request.h |  3 +++
 drivers/gpu/drm/i915/intel_ringbuffer.c | 15 ++++-----------
 drivers/gpu/drm/i915/intel_ringbuffer.h |  2 ++
 4 files changed, 11 insertions(+), 11 deletions(-)

Comments

Joonas Lahtinen July 26, 2016, 10:10 a.m. UTC | #1
On ma, 2016-07-25 at 18:32 +0100, Chris Wilson wrote:
> By tracking each request occupying space inside an individual
> intel_ring, we can greatly simplify the logic of tracking available
> space and not worry about other timelines. (Each ring is an ordered
> timeline of committed requests.)
> 
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>

Not such an amazing simplification in this patch, but I assume later.

Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>

Regards, Joonas

> ---
>  drivers/gpu/drm/i915/i915_gem_request.c |  2 ++
>  drivers/gpu/drm/i915/i915_gem_request.h |  3 +++
>  drivers/gpu/drm/i915/intel_ringbuffer.c | 15 ++++-----------
>  drivers/gpu/drm/i915/intel_ringbuffer.h |  2 ++
>  4 files changed, 11 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem_request.c b/drivers/gpu/drm/i915/i915_gem_request.c
> index 0216d6c093da..f1c37b7891cb 100644
> --- a/drivers/gpu/drm/i915/i915_gem_request.c
> +++ b/drivers/gpu/drm/i915/i915_gem_request.c
> @@ -174,6 +174,7 @@ static void i915_gem_request_retire(struct drm_i915_gem_request *request)
>  	 * Note this requires that we are always called in request
>  	 * completion order.
>  	 */
> +	list_del(&request->ring_link);
>  	request->ring->last_retired_head = request->postfix;
>  
>  	/* Walk through the active list, calling retire on each. This allows
> @@ -472,6 +473,7 @@ void __i915_add_request(struct drm_i915_gem_request *request,
>  	request->previous_seqno = engine->last_submitted_seqno;
>  	smp_store_mb(engine->last_submitted_seqno, request->fence.seqno);
>  	list_add_tail(&request->link, &engine->request_list);
> +	list_add_tail(&request->ring_link, &ring->request_list);
>  
>  	/* Record the position of the start of the request so that
>  	 * should we detect the updated seqno part-way through the
> diff --git a/drivers/gpu/drm/i915/i915_gem_request.h b/drivers/gpu/drm/i915/i915_gem_request.h
> index f0b91207aaa4..b1ee37896feb 100644
> --- a/drivers/gpu/drm/i915/i915_gem_request.h
> +++ b/drivers/gpu/drm/i915/i915_gem_request.h
> @@ -109,6 +109,9 @@ struct drm_i915_gem_request {
>  	/** engine->request_list entry for this request */
>  	struct list_head link;
>  
> +	/** ring->request_list entry for this request */
> +	struct list_head ring_link;
> +
>  	struct drm_i915_file_private *file_priv;
>  	/** file_priv list entry for this request */
>  	struct list_head client_list;
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
> index 5e0ba9416bd9..af76869c8db2 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.c
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
> @@ -2059,6 +2059,8 @@ intel_engine_create_ring(struct intel_engine_cs *engine, int size)
>  	ring->engine = engine;
>  	list_add(&ring->link, &engine->buffers);
>  
> +	INIT_LIST_HEAD(&ring->request_list);
> +
>  	ring->size = size;
>  	/* Workaround an erratum on the i830 which causes a hang if
>  	 * the TAIL pointer points to within the last 2 cachelines
> @@ -2281,7 +2283,6 @@ int intel_ring_alloc_request_extras(struct drm_i915_gem_request *request)
>  static int wait_for_space(struct drm_i915_gem_request *req, int bytes)
>  {
>  	struct intel_ring *ring = req->ring;
> -	struct intel_engine_cs *engine = req->engine;
>  	struct drm_i915_gem_request *target;
>  
>  	intel_ring_update_space(ring);
> @@ -2299,17 +2300,9 @@ static int wait_for_space(struct drm_i915_gem_request *req, int bytes)
>  	 */
>  	GEM_BUG_ON(!req->reserved_space);
>  
> -	list_for_each_entry(target, &engine->request_list, link) {
> +	list_for_each_entry(target, &ring->request_list, ring_link) {
>  		unsigned space;
>  
> -		/*
> -		 * The request queue is per-engine, so can contain requests
> -		 * from multiple ringbuffers. Here, we must ignore any that
> -		 * aren't from the ringbuffer we're considering.
> -		 */
> -		if (target->ring != ring)
> -			continue;
> -
>  		/* Would completion of this request free enough space? */
>  		space = __intel_ring_space(target->postfix, ring->tail,
>  					   ring->size);
> @@ -2317,7 +2310,7 @@ static int wait_for_space(struct drm_i915_gem_request *req, int bytes)
>  			break;
>  	}
>  
> -	if (WARN_ON(&target->link == &engine->request_list))
> +	if (WARN_ON(&target->ring_link == &ring->request_list))
>  		return -ENOSPC;
>  
>  	return i915_wait_request(target);
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
> index 51c059d8c917..2681106948a5 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.h
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
> @@ -90,6 +90,8 @@ struct intel_ring {
>  	struct intel_engine_cs *engine;
>  	struct list_head link;
>  
> +	struct list_head request_list;
> +
>  	u32 head;
>  	u32 tail;
>  	int space;
Chris Wilson July 26, 2016, 10:15 a.m. UTC | #2
On Tue, Jul 26, 2016 at 01:10:16PM +0300, Joonas Lahtinen wrote:
> On ma, 2016-07-25 at 18:32 +0100, Chris Wilson wrote:
> > By tracking each request occupying space inside an individual
> > intel_ring, we can greatly simplify the logic of tracking available
> > space and not worry about other timelines. (Each ring is an ordered
> > timeline of committed requests.)
> > 
> > Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> 
> Not such an amazing simplification in this patch, but I assume later.

:) Yes, you don't get to see the contortions now. A stitch in time is
worth nine!
-Chris
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/i915_gem_request.c b/drivers/gpu/drm/i915/i915_gem_request.c
index 0216d6c093da..f1c37b7891cb 100644
--- a/drivers/gpu/drm/i915/i915_gem_request.c
+++ b/drivers/gpu/drm/i915/i915_gem_request.c
@@ -174,6 +174,7 @@  static void i915_gem_request_retire(struct drm_i915_gem_request *request)
 	 * Note this requires that we are always called in request
 	 * completion order.
 	 */
+	list_del(&request->ring_link);
 	request->ring->last_retired_head = request->postfix;
 
 	/* Walk through the active list, calling retire on each. This allows
@@ -472,6 +473,7 @@  void __i915_add_request(struct drm_i915_gem_request *request,
 	request->previous_seqno = engine->last_submitted_seqno;
 	smp_store_mb(engine->last_submitted_seqno, request->fence.seqno);
 	list_add_tail(&request->link, &engine->request_list);
+	list_add_tail(&request->ring_link, &ring->request_list);
 
 	/* Record the position of the start of the request so that
 	 * should we detect the updated seqno part-way through the
diff --git a/drivers/gpu/drm/i915/i915_gem_request.h b/drivers/gpu/drm/i915/i915_gem_request.h
index f0b91207aaa4..b1ee37896feb 100644
--- a/drivers/gpu/drm/i915/i915_gem_request.h
+++ b/drivers/gpu/drm/i915/i915_gem_request.h
@@ -109,6 +109,9 @@  struct drm_i915_gem_request {
 	/** engine->request_list entry for this request */
 	struct list_head link;
 
+	/** ring->request_list entry for this request */
+	struct list_head ring_link;
+
 	struct drm_i915_file_private *file_priv;
 	/** file_priv list entry for this request */
 	struct list_head client_list;
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index 5e0ba9416bd9..af76869c8db2 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -2059,6 +2059,8 @@  intel_engine_create_ring(struct intel_engine_cs *engine, int size)
 	ring->engine = engine;
 	list_add(&ring->link, &engine->buffers);
 
+	INIT_LIST_HEAD(&ring->request_list);
+
 	ring->size = size;
 	/* Workaround an erratum on the i830 which causes a hang if
 	 * the TAIL pointer points to within the last 2 cachelines
@@ -2281,7 +2283,6 @@  int intel_ring_alloc_request_extras(struct drm_i915_gem_request *request)
 static int wait_for_space(struct drm_i915_gem_request *req, int bytes)
 {
 	struct intel_ring *ring = req->ring;
-	struct intel_engine_cs *engine = req->engine;
 	struct drm_i915_gem_request *target;
 
 	intel_ring_update_space(ring);
@@ -2299,17 +2300,9 @@  static int wait_for_space(struct drm_i915_gem_request *req, int bytes)
 	 */
 	GEM_BUG_ON(!req->reserved_space);
 
-	list_for_each_entry(target, &engine->request_list, link) {
+	list_for_each_entry(target, &ring->request_list, ring_link) {
 		unsigned space;
 
-		/*
-		 * The request queue is per-engine, so can contain requests
-		 * from multiple ringbuffers. Here, we must ignore any that
-		 * aren't from the ringbuffer we're considering.
-		 */
-		if (target->ring != ring)
-			continue;
-
 		/* Would completion of this request free enough space? */
 		space = __intel_ring_space(target->postfix, ring->tail,
 					   ring->size);
@@ -2317,7 +2310,7 @@  static int wait_for_space(struct drm_i915_gem_request *req, int bytes)
 			break;
 	}
 
-	if (WARN_ON(&target->link == &engine->request_list))
+	if (WARN_ON(&target->ring_link == &ring->request_list))
 		return -ENOSPC;
 
 	return i915_wait_request(target);
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index 51c059d8c917..2681106948a5 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -90,6 +90,8 @@  struct intel_ring {
 	struct intel_engine_cs *engine;
 	struct list_head link;
 
+	struct list_head request_list;
+
 	u32 head;
 	u32 tail;
 	int space;