[Intel-gfx] [PATCH 08/59] drm/i915: Set context in request from creation even in legacy mode

Tomas Elf tomas.elf at intel.com
Tue Mar 31 09:10:14 PDT 2015


On 19/03/2015 12:30, John.C.Harrison at Intel.com wrote:
> From: John Harrison <John.C.Harrison at Intel.com>
>
> In execlist mode, the context object pointer is written in to the request
> structure (and reference counted) at the point of request creation. In legacy
> mode, this only happens inside i915_add_request().
>
> This patch updates the legacy code path to match the execlist version. This
> allows all the intermediate code between request creation and request submission
> to get at the context object given only a request structure. Thus negating the
> need to pass context pointers here, there and everywhere.
>
> v2: Moved the context reference so it does not need to be undone if the
> get_seqno() fails.
>
> v3: Fixed execlist mode always hitting a warning about invalid last_contexts
> (which don't exist in execlist mode).
>
> v4: Updated for new i915_gem_request_alloc() scheme.
>
> For: VIZ-5115
> Signed-off-by: John Harrison <John.C.Harrison at Intel.com>
> ---
>   drivers/gpu/drm/i915/i915_gem.c  |   14 +++++---------
>   drivers/gpu/drm/i915/intel_lrc.c |   11 ++++-------
>   drivers/gpu/drm/i915/intel_lrc.h |    3 +--
>   3 files changed, 10 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index cdf1c9d..f35ac7f 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -2393,14 +2393,7 @@ void __i915_add_request(struct intel_engine_cs *ring,
>   	 */
>   	request->batch_obj = obj;
>
> -	if (!i915.enable_execlists) {
> -		/* Hold a reference to the current context so that we can inspect
> -		 * it later in case a hangcheck error event fires.
> -		 */
> -		request->ctx = ring->last_context;
> -		if (request->ctx)
> -			i915_gem_context_reference(request->ctx);
> -	}
> +	WARN_ON(!i915.enable_execlists && (request->ctx != ring->last_context));
>
>   	request->emitted_jiffies = jiffies;
>   	list_add_tail(&request->list, &ring->request_list);
> @@ -2545,12 +2538,15 @@ int i915_gem_request_alloc(struct intel_engine_cs *ring,
>   	kref_init(&request->ref);
>   	request->ring = ring;
>   	request->uniq = dev_private->request_uniq++;
> +	request->ctx  = ctx;
> +	i915_gem_context_reference(request->ctx);
>
>   	if (i915.enable_execlists)
> -		ret = intel_logical_ring_alloc_request_extras(request, ctx);
> +		ret = intel_logical_ring_alloc_request_extras(request);
>   	else
>   		ret = intel_ring_alloc_request_extras(request);
>   	if (ret) {
> +		i915_gem_context_unreference(request->ctx);
>   		kfree(request);
>   		return ret;
>   	}
> diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
> index 8d48761..a0ce65b 100644
> --- a/drivers/gpu/drm/i915/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/intel_lrc.c
> @@ -611,20 +611,17 @@ static int execlists_move_to_gpu(struct intel_ringbuffer *ringbuf,
>   	return logical_ring_invalidate_all_caches(ringbuf, ctx);
>   }
>
> -int intel_logical_ring_alloc_request_extras(struct drm_i915_gem_request *request,
> -					    struct intel_context *ctx)
> +int intel_logical_ring_alloc_request_extras(struct drm_i915_gem_request *request)
>   {
>   	int ret;
>
> -	if (ctx != request->ring->default_context) {
> -		ret = intel_lr_context_pin(request->ring, ctx);
> +	if (request->ctx != request->ring->default_context) {
> +		ret = intel_lr_context_pin(request->ring, request->ctx);
>   		if (ret)
>   			return ret;
>   	}
>
> -	request->ringbuf = ctx->engine[request->ring->id].ringbuf;
> -	request->ctx     = ctx;
> -	i915_gem_context_reference(request->ctx);
> +	request->ringbuf = request->ctx->engine[request->ring->id].ringbuf;
>
>   	return 0;
>   }
> diff --git a/drivers/gpu/drm/i915/intel_lrc.h b/drivers/gpu/drm/i915/intel_lrc.h
> index 04d3a6d..4148de0 100644
> --- a/drivers/gpu/drm/i915/intel_lrc.h
> +++ b/drivers/gpu/drm/i915/intel_lrc.h
> @@ -36,8 +36,7 @@
>   #define RING_CONTEXT_STATUS_PTR(ring)	((ring)->mmio_base+0x3a0)
>
>   /* Logical Rings */
> -int intel_logical_ring_alloc_request_extras(struct drm_i915_gem_request *request,
> -					    struct intel_context *ctx);
> +int intel_logical_ring_alloc_request_extras(struct drm_i915_gem_request *request);
>   void intel_logical_ring_stop(struct intel_engine_cs *ring);
>   void intel_logical_ring_cleanup(struct intel_engine_cs *ring);
>   int intel_logical_rings_init(struct drm_device *dev);
>

Reviewed-by: Tomas Elf <tomas.elf at intel.com>

Thanks,
Tomas


More information about the Intel-gfx mailing list