Re: [PATCH 21/53] drm/i915: Set context in request from creation even in legacy mode

Tomas Elf
2015-03-05T18:02:19Z

On 19/02/2015 17:17, John.C.Harrison@Intel.com wrote:
> From: John Harrison <John.C.Harrison@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.
>
> For: VIZ-5115
> Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
> ---
> drivers/gpu/drm/i915/i915_gem.c | 9 +--------
> drivers/gpu/drm/i915/intel_ringbuffer.c | 2 ++
> 2 files changed, 3 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 379bf44..64288e3 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -2470,14 +2470,7 @@ int __i915_add_request(struct intel_engine_cs *ring,
> WARN_ON(request->batch_obj && obj);
> 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(request->ctx != ring->last_context);

__i915_add_request is gen agnostic but ring->last_context is only used
in legacy mode. Maybe you want to check for !i915.enable_execlists just
like in the block you removed above?

>
> request->emitted_jiffies = jiffies;
> list_add_tail(&request->list, &ring->request_list);
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
> index 1a9f884..05a7e33 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.c
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
> @@ -2186,6 +2186,8 @@ intel_ring_alloc_request(struct intel_engine_cs *ring,
> request->ring = ring;
> request->ringbuf = ring->buffer;
> request->uniq = dev_private->request_uniq++;
> + request->ctx = ctx;
> + i915_gem_context_reference(request->ctx);
>
> ret = i915_gem_get_seqno(ring->dev, &request->seqno);
> if (ret) {
>