All of lore.kernel.org
 help / color / mirror / Atom feed
From: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
To: Chris Wilson <chris@chris-wilson.co.uk>, intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 18/18] drm/i915: Simplify calling engine->sync_to
Date: Fri, 22 Jul 2016 11:59:27 +0300	[thread overview]
Message-ID: <1469177967.5916.26.camel@linux.intel.com> (raw)
In-Reply-To: <1469020330-1071-19-git-send-email-chris@chris-wilson.co.uk>

On ke, 2016-07-20 at 14:12 +0100, Chris Wilson wrote:
> Since requests can no longer be generated as a side-effect of
> intel_ring_begin(), we know that the seqno will be unchanged during
> ring-emission. This predicatablity then means we do not have to check
> for the seqno wrapping around whilst emitting the semaphore for
> engine->sync_to().
> 
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> ---
>  drivers/gpu/drm/i915/i915_drv.h         |  2 +-
>  drivers/gpu/drm/i915/i915_gem.c         | 13 ++-----
>  drivers/gpu/drm/i915/i915_gem_request.c |  9 +----
>  drivers/gpu/drm/i915/intel_ringbuffer.c | 64 ++++++++++++---------------------
>  drivers/gpu/drm/i915/intel_ringbuffer.h |  5 ++-
>  5 files changed, 30 insertions(+), 63 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index f188c9a9b746..c374b8687d87 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -1757,7 +1757,7 @@ struct drm_i915_private {
>  	struct i915_gem_context *kernel_context;
>  	struct intel_engine_cs engine[I915_NUM_ENGINES];
>  	struct drm_i915_gem_object *semaphore_obj;
> -	uint32_t last_seqno, next_seqno;
> +	u32 next_seqno;
>  
>  	struct drm_dma_handle *status_page_dmah;
>  	struct resource mch_res;
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 9fdecef34fa8..0b7a0e6f9dd1 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -2864,22 +2864,15 @@ __i915_gem_object_sync(struct drm_i915_gem_object *obj,
>  		i915_gem_object_retire_request(obj, from);
>  	} else {
>  		int idx = intel_engine_sync_index(from->engine, to->engine);
> -		u32 seqno = i915_gem_request_get_seqno(from);
> -
> -		if (seqno <= from->engine->semaphore.sync_seqno[idx])
> +		if (from->fence.seqno <= from->engine->semaphore.sync_seqno[idx])
>  			return 0;
>  
>  		trace_i915_gem_ring_sync_to(to, from);
> -		ret = to->engine->semaphore.sync_to(to, from->engine, seqno);
> +		ret = to->engine->semaphore.sync_to(to, from);
>  		if (ret)
>  			return ret;
>  
> -		/* We use last_read_req because sync_to()
> -		 * might have just caused seqno wrap under
> -		 * the radar.
> -		 */
> -		from->engine->semaphore.sync_seqno[idx] =
> -			i915_gem_request_get_seqno(obj->last_read_req[from->engine->id]);
> +		from->engine->semaphore.sync_seqno[idx] = from->fence.seqno;
>  	}
>  
>  	return 0;
> diff --git a/drivers/gpu/drm/i915/i915_gem_request.c b/drivers/gpu/drm/i915/i915_gem_request.c
> index 3e633b47213c..dfdb86c8a433 100644
> --- a/drivers/gpu/drm/i915/i915_gem_request.c
> +++ b/drivers/gpu/drm/i915/i915_gem_request.c
> @@ -264,14 +264,7 @@ int i915_gem_set_seqno(struct drm_device *dev, u32 seqno)
>  	if (ret)
>  		return ret;
>  
> -	/* Carefully set the last_seqno value so that wrap
> -	 * detection still works
> -	 */
>  	dev_priv->next_seqno = seqno;
> -	dev_priv->last_seqno = seqno - 1;
> -	if (dev_priv->last_seqno == 0)
> -		dev_priv->last_seqno--;
> -
>  	return 0;
>  }
>  
> @@ -288,7 +281,7 @@ static int i915_gem_get_seqno(struct drm_i915_private *dev_priv, u32 *seqno)
>  		dev_priv->next_seqno = 1;
>  	}
>  
> -	*seqno = dev_priv->last_seqno = dev_priv->next_seqno++;
> +	*seqno = dev_priv->next_seqno++;
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
> index 8ae25bcc876e..bfeb16025327 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.c
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
> @@ -1494,12 +1494,6 @@ static int gen8_render_emit_request(struct drm_i915_gem_request *req)
>  	return 0;
>  }
>  
> -static inline bool i915_gem_has_seqno_wrapped(struct drm_i915_private *dev_priv,
> -					      u32 seqno)
> -{
> -	return dev_priv->last_seqno < seqno;
> -}
> -
>  /**
>   * intel_ring_sync - sync the waiter to the signaller on seqno
>   *
> @@ -1509,24 +1503,23 @@ static inline bool i915_gem_has_seqno_wrapped(struct drm_i915_private *dev_priv,
>   */
>  
>  static int
> -gen8_ring_sync(struct drm_i915_gem_request *waiter_req,
> -	       struct intel_engine_cs *signaller,
> -	       u32 seqno)
> +gen8_ring_sync(struct drm_i915_gem_request *wait,

Why not to, from here too or in the header then, when they're revamped
in the series? To bring some clarity. Maybe wait and signal in header
too rather.

> +	       struct drm_i915_gem_request *signal)
>  {
> -	struct intel_ring *waiter = waiter_req->ring;
> -	struct drm_i915_private *dev_priv = waiter_req->i915;
> -	u64 offset = GEN8_WAIT_OFFSET(waiter_req->engine, signaller->id);
> +	struct intel_ring *waiter = wait->ring;

Just call this "ring" to reduce confusion of renaming the other
variable, then the ring_begin(wait) ring_emit() convention makes more
sense.

> +	struct drm_i915_private *dev_priv = wait->i915;
> +	u64 offset = GEN8_WAIT_OFFSET(wait->engine, signal->engine->id);
>  	struct i915_hw_ppgtt *ppgtt;
>  	int ret;
>  
> -	ret = intel_ring_begin(waiter_req, 4);
> +	ret = intel_ring_begin(wait, 4);
>  	if (ret)
>  		return ret;
>  
>  	intel_ring_emit(waiter, MI_SEMAPHORE_WAIT |
>  				MI_SEMAPHORE_GLOBAL_GTT |
>  				MI_SEMAPHORE_SAD_GTE_SDD);
> -	intel_ring_emit(waiter, seqno);
> +	intel_ring_emit(waiter, signal->fence.seqno);
>  	intel_ring_emit(waiter, lower_32_bits(offset));
>  	intel_ring_emit(waiter, upper_32_bits(offset));
>  	intel_ring_advance(waiter);
> @@ -1536,48 +1529,37 @@ gen8_ring_sync(struct drm_i915_gem_request *waiter_req,
>  	 * We do this on the i915_switch_context() following the wait and
>  	 * before the dispatch.
>  	 */
> -	ppgtt = waiter_req->ctx->ppgtt;
> -	if (ppgtt && waiter_req->engine->id != RCS)
> -		ppgtt->pd_dirty_rings |= intel_engine_flag(waiter_req->engine);
> +	ppgtt = wait->ctx->ppgtt;

This could be moved to initialization line, like elsewhere.

> +	if (ppgtt && wait->engine->id != RCS)
> +		ppgtt->pd_dirty_rings |= intel_engine_flag(wait->engine);
>  	return 0;
>  }
>  
>  static int
> -gen6_ring_sync(struct drm_i915_gem_request *waiter_req,
> -	       struct intel_engine_cs *signaller,
> -	       u32 seqno)
> +gen6_ring_sync(struct drm_i915_gem_request *wait,
> +	       struct drm_i915_gem_request *signal)
>  {
> -	struct intel_ring *waiter = waiter_req->ring;
> +	struct intel_ring *waiter = wait->ring;
>  	u32 dw1 = MI_SEMAPHORE_MBOX |
>  		  MI_SEMAPHORE_COMPARE |
>  		  MI_SEMAPHORE_REGISTER;
> -	u32 wait_mbox = signaller->semaphore.mbox.wait[waiter_req->engine->id];
> +	u32 wait_mbox = signal->engine->semaphore.mbox.wait[wait->engine->id];
>  	int ret;
>  
> -	/* Throughout all of the GEM code, seqno passed implies our current
> -	 * seqno is >= the last seqno executed. However for hardware the
> -	 * comparison is strictly greater than.
> -	 */
> -	seqno -= 1;
> -

Finally we get rid of this \o/

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

>  	WARN_ON(wait_mbox == MI_SEMAPHORE_SYNC_INVALID);
>  
> -	ret = intel_ring_begin(waiter_req, 4);
> +	ret = intel_ring_begin(wait, 4);
>  	if (ret)
>  		return ret;
>  
> -	/* If seqno wrap happened, omit the wait with no-ops */
> -	if (likely(!i915_gem_has_seqno_wrapped(waiter_req->i915, seqno))) {
> -		intel_ring_emit(waiter, dw1 | wait_mbox);
> -		intel_ring_emit(waiter, seqno);
> -		intel_ring_emit(waiter, 0);
> -		intel_ring_emit(waiter, MI_NOOP);
> -	} else {
> -		intel_ring_emit(waiter, MI_NOOP);
> -		intel_ring_emit(waiter, MI_NOOP);
> -		intel_ring_emit(waiter, MI_NOOP);
> -		intel_ring_emit(waiter, MI_NOOP);
> -	}
> +	intel_ring_emit(waiter, dw1 | wait_mbox);
> +	/* Throughout all of the GEM code, seqno passed implies our current
> +	 * seqno is >= the last seqno executed. However for hardware the
> +	 * comparison is strictly greater than.
> +	 */
> +	intel_ring_emit(waiter, signal->fence.seqno - 1);
> +	intel_ring_emit(waiter, 0);
> +	intel_ring_emit(waiter, MI_NOOP);
>  	intel_ring_advance(waiter);
>  
>  	return 0;
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
> index 08e86204a3d5..65cb6adf26ca 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.h
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
> @@ -275,9 +275,8 @@ struct intel_engine_cs {
>  		};
>  
>  		/* AKA wait() */
> -		int	(*sync_to)(struct drm_i915_gem_request *to_req,
> -				   struct intel_engine_cs *from,
> -				   u32 seqno);
> +		int	(*sync_to)(struct drm_i915_gem_request *to,
> +				   struct drm_i915_gem_request *from);
>  		int	(*signal)(struct drm_i915_gem_request *signaller_req);
>  	} semaphore;
>  
-- 
Joonas Lahtinen
Open Source Technology Center
Intel Corporation
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2016-07-22  8:59 UTC|newest]

Thread overview: 72+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-07-20 13:11 Unify request construction Chris Wilson
2016-07-20 13:11 ` [PATCH 01/18] drm/i915: Unify intel_logical_ring_emit and intel_ring_emit Chris Wilson
2016-07-21 11:26   ` Joonas Lahtinen
2016-07-21 12:09     ` Chris Wilson
2016-07-20 13:11 ` [PATCH 02/18] drm/i915: Rename request->ringbuf to request->ring Chris Wilson
2016-07-20 14:12   ` Dave Gordon
2016-07-20 14:51     ` Dave Gordon
2016-07-20 15:00     ` [PATCH] drm/i915: Convert stray struct intel_engine_cs *ring Chris Wilson
2016-07-27 13:15       ` Dave Gordon
2016-07-21 11:28   ` [PATCH 02/18] drm/i915: Rename request->ringbuf to request->ring Joonas Lahtinen
2016-07-20 13:11 ` [PATCH 03/18] drm/i915: Rename backpointer from intel_ringbuffer to intel_engine_cs Chris Wilson
2016-07-20 14:23   ` Dave Gordon
2016-07-21 11:32   ` Joonas Lahtinen
2016-07-21 11:42     ` Chris Wilson
2016-07-20 13:11 ` [PATCH 04/18] drm/i915: Rename intel_context[engine].ringbuf Chris Wilson
2016-07-21 11:43   ` Joonas Lahtinen
2016-07-20 13:11 ` [PATCH 05/18] drm/i915: Rename struct intel_ringbuffer to struct intel_ring Chris Wilson
2016-07-21 11:59   ` Joonas Lahtinen
2016-07-21 16:02     ` Chris Wilson
2016-07-20 13:11 ` [PATCH 06/18] drm/i915: Rename residual ringbuf parameters Chris Wilson
2016-07-21 12:01   ` Joonas Lahtinen
2016-07-21 12:20     ` Chris Wilson
2016-07-20 13:11 ` [PATCH 07/18] drm/i915: Rename intel_pin_and_map_ring() Chris Wilson
2016-07-21 12:02   ` Joonas Lahtinen
2016-07-20 13:12 ` [PATCH 08/18] drm/i915: Remove obsolete engine->gpu_caches_dirty Chris Wilson
2016-07-20 13:12 ` [PATCH 09/18] drm/i915: Simplify request_alloc by returning the allocated request Chris Wilson
2016-07-21 13:07   ` Joonas Lahtinen
2016-07-21 13:18     ` Chris Wilson
2016-07-20 13:12 ` [PATCH 10/18] drm/i915: Unify legacy/execlists emission of MI_BATCHBUFFER_START Chris Wilson
2016-07-21 13:39   ` Joonas Lahtinen
2016-07-21 14:14     ` Chris Wilson
2016-07-27 15:04       ` Dave Gordon
2016-07-27 15:19         ` Chris Wilson
2016-07-20 13:12 ` [PATCH 11/18] drm/i915: Convert engine->write_tail to operate on a request Chris Wilson
2016-07-21 13:52   ` Joonas Lahtinen
2016-07-20 13:12 ` [PATCH 12/18] drm/i915: Unify request submission Chris Wilson
2016-07-22  8:03   ` Joonas Lahtinen
2016-07-22  8:24     ` Chris Wilson
2016-07-27 17:51     ` Dave Gordon
2016-07-27 18:09       ` Chris Wilson
2016-07-27 18:17         ` Chris Wilson
2016-07-28 10:25         ` Dave Gordon
2016-07-28 11:49           ` Daniel Vetter
2016-07-20 13:12 ` [PATCH 13/18] drm/i915: Stop passing caller's num_dwords to engine->semaphore.signal() Chris Wilson
2016-07-22  8:15   ` Joonas Lahtinen
2016-07-22  8:30     ` Chris Wilson
2016-07-22  9:06       ` Joonas Lahtinen
2016-07-20 13:12 ` [PATCH 14/18] drm/i915: Reuse legacy breadcrumbs + tail emission Chris Wilson
2016-07-22  8:34   ` Joonas Lahtinen
2016-07-20 13:12 ` [PATCH 15/18] drm/i915/ringbuffer: Specialise SNB+ request emission for semaphores Chris Wilson
2016-07-21 13:55   ` Joonas Lahtinen
2016-07-21 14:10     ` Chris Wilson
2016-07-22  9:42       ` Joonas Lahtinen
2016-07-20 13:12 ` [PATCH 16/18] drm/i915: Remove duplicate golden render state init from execlists Chris Wilson
2016-07-21 14:18   ` Joonas Lahtinen
2016-07-21 16:27     ` Chris Wilson
2016-07-21 16:37       ` Chris Wilson
2016-07-22  9:53         ` Joonas Lahtinen
2016-07-22 10:16           ` [PATCH] drm/i915: Refactor golden render state emission to unconfuse gcc Chris Wilson
2016-07-22 10:33             ` Joonas Lahtinen
2016-07-20 13:12 ` [PATCH 17/18] drm/i915: Unify legacy/execlists submit_execbuf callbacks Chris Wilson
2016-07-22  8:45   ` Joonas Lahtinen
2016-07-20 13:12 ` [PATCH 18/18] drm/i915: Simplify calling engine->sync_to Chris Wilson
2016-07-22  8:59   ` Joonas Lahtinen [this message]
2016-07-22  9:14     ` [PATCH] drm/i915: Rename engine->semaphore.sync_to, engine->sempahore.signal locals Chris Wilson
2016-07-22  9:28       ` Joonas Lahtinen
2016-07-22  9:31         ` Chris Wilson
2016-07-22  9:38           ` Joonas Lahtinen
2016-07-20 13:54 ` ✓ Ro.CI.BAT: success for series starting with [01/18] drm/i915: Unify intel_logical_ring_emit and intel_ring_emit Patchwork
2016-07-20 15:10 ` ✗ Ro.CI.BAT: failure for series starting with [01/18] drm/i915: Unify intel_logical_ring_emit and intel_ring_emit (rev2) Patchwork
2016-07-22  9:58 ` ✗ Ro.CI.BAT: failure for series starting with [01/18] drm/i915: Unify intel_logical_ring_emit and intel_ring_emit (rev4) Patchwork
2016-07-22 10:22 ` ✗ Ro.CI.BAT: failure for series starting with [01/18] drm/i915: Unify intel_logical_ring_emit and intel_ring_emit (rev5) 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=1469177967.5916.26.camel@linux.intel.com \
    --to=joonas.lahtinen@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 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.