Message ID | 1424366285-29232-23-git-send-email-John.C.Harrison@Intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 19/02/2015 17:17, John.C.Harrison@Intel.com wrote: > From: John Harrison <John.C.Harrison@Intel.com> > > Now that the request is guaranteed to specify the context, it is possible to > update the context switch code to use requests rather than ring and context > pairs. This patch updates i915_switch_context() accordingly. > > Also removed the warning that the request's context must match the last context > switch's context. As the context switch now gets the context object from the > request structure, there is no longer any scope for the two to become out of > step. > > For: VIZ-5115 > Signed-off-by: John Harrison <John.C.Harrison@Intel.com> > --- > drivers/gpu/drm/i915/i915_drv.h | 3 +-- > drivers/gpu/drm/i915/i915_gem.c | 4 +--- > drivers/gpu/drm/i915/i915_gem_context.c | 19 +++++++++---------- > drivers/gpu/drm/i915/i915_gem_execbuffer.c | 2 +- > 4 files changed, 12 insertions(+), 16 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > index 618a841..e9cc343 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -2992,8 +2992,7 @@ void i915_gem_context_reset(struct drm_device *dev); > int i915_gem_context_open(struct drm_device *dev, struct drm_file *file); > int i915_gem_context_enable(struct drm_i915_gem_request *req); > void i915_gem_context_close(struct drm_device *dev, struct drm_file *file); > -int i915_switch_context(struct intel_engine_cs *ring, > - struct intel_context *to); > +int i915_switch_context(struct drm_i915_gem_request *req); > struct intel_context * > i915_gem_context_get(struct drm_i915_file_private *file_priv, u32 id); > void i915_gem_context_free(struct kref *ctx_ref); > diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c > index 64288e3..0c7e1bd 100644 > --- a/drivers/gpu/drm/i915/i915_gem.c > +++ b/drivers/gpu/drm/i915/i915_gem.c > @@ -2470,8 +2470,6 @@ int __i915_add_request(struct intel_engine_cs *ring, > WARN_ON(request->batch_obj && obj); > request->batch_obj = obj; > > - WARN_ON(request->ctx != ring->last_context); > - > request->emitted_jiffies = jiffies; > list_add_tail(&request->list, &ring->request_list); > request->file_priv = NULL; > @@ -3114,7 +3112,7 @@ int i915_gpu_idle(struct drm_device *dev) > if (ret) > return ret; > > - ret = i915_switch_context(req->ring, ring->default_context); > + ret = i915_switch_context(req); > if (ret) { > i915_gem_request_unreference(req); > return ret; > diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c > index 04d2a20..b326f8d 100644 > --- a/drivers/gpu/drm/i915/i915_gem_context.c > +++ b/drivers/gpu/drm/i915/i915_gem_context.c > @@ -414,7 +414,7 @@ int i915_gem_context_enable(struct drm_i915_gem_request *req) > > ret = ring->init_context(req->ring, ring->default_context); > } else > - ret = i915_switch_context(req->ring, ring->default_context); > + ret = i915_switch_context(req); > > if (ret) { > DRM_ERROR("ring init context: %d\n", ret); > @@ -693,8 +693,7 @@ unpin_out: > > /** > * i915_switch_context() - perform a GPU context switch. > - * @ring: ring for which we'll execute the context switch > - * @to: the context to switch to > + * @req: request for which we'll execute the context switch > * > * The context life cycle is simple. The context refcount is incremented and > * decremented by 1 and create and destroy. If the context is in use by the GPU, > @@ -705,25 +704,25 @@ unpin_out: > * switched by writing to the ELSP and requests keep a reference to their > * context. > */ > -int i915_switch_context(struct intel_engine_cs *ring, > - struct intel_context *to) > +int i915_switch_context(struct drm_i915_gem_request *req) > { > + struct intel_engine_cs *ring = req->ring; > struct drm_i915_private *dev_priv = ring->dev->dev_private; > > WARN_ON(i915.enable_execlists); > WARN_ON(!mutex_is_locked(&dev_priv->dev->struct_mutex)); > > - if (to->legacy_hw_ctx.rcs_state == NULL) { /* We have the fake context */ > - if (to != ring->last_context) { > - i915_gem_context_reference(to); > + if (req->ctx->legacy_hw_ctx.rcs_state == NULL) { /* We have the fake context */ > + if (req->ctx != ring->last_context) { > + i915_gem_context_reference(req->ctx); > if (ring->last_context) > i915_gem_context_unreference(ring->last_context); > - ring->last_context = to; > + ring->last_context = req->ctx; > } > return 0; > } > > - return do_switch(ring, to); > + return do_switch(req->ring, req->ctx); > } > > static bool contexts_enabled(struct drm_device *dev) > diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c > index 2cd0579..1e2fc80 100644 > --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c > +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c > @@ -1190,7 +1190,7 @@ i915_gem_ringbuffer_submission(struct i915_execbuffer_params *params, > if (ret) > goto error; > > - ret = i915_switch_context(ring, params->ctx); > + ret = i915_switch_context(params->request); > if (ret) > goto error; > > Reviewed-by: Tomas Elf <tomas.elf@intel.com> Thanks, Tomas
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 618a841..e9cc343 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -2992,8 +2992,7 @@ void i915_gem_context_reset(struct drm_device *dev); int i915_gem_context_open(struct drm_device *dev, struct drm_file *file); int i915_gem_context_enable(struct drm_i915_gem_request *req); void i915_gem_context_close(struct drm_device *dev, struct drm_file *file); -int i915_switch_context(struct intel_engine_cs *ring, - struct intel_context *to); +int i915_switch_context(struct drm_i915_gem_request *req); struct intel_context * i915_gem_context_get(struct drm_i915_file_private *file_priv, u32 id); void i915_gem_context_free(struct kref *ctx_ref); diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 64288e3..0c7e1bd 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -2470,8 +2470,6 @@ int __i915_add_request(struct intel_engine_cs *ring, WARN_ON(request->batch_obj && obj); request->batch_obj = obj; - WARN_ON(request->ctx != ring->last_context); - request->emitted_jiffies = jiffies; list_add_tail(&request->list, &ring->request_list); request->file_priv = NULL; @@ -3114,7 +3112,7 @@ int i915_gpu_idle(struct drm_device *dev) if (ret) return ret; - ret = i915_switch_context(req->ring, ring->default_context); + ret = i915_switch_context(req); if (ret) { i915_gem_request_unreference(req); return ret; diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c index 04d2a20..b326f8d 100644 --- a/drivers/gpu/drm/i915/i915_gem_context.c +++ b/drivers/gpu/drm/i915/i915_gem_context.c @@ -414,7 +414,7 @@ int i915_gem_context_enable(struct drm_i915_gem_request *req) ret = ring->init_context(req->ring, ring->default_context); } else - ret = i915_switch_context(req->ring, ring->default_context); + ret = i915_switch_context(req); if (ret) { DRM_ERROR("ring init context: %d\n", ret); @@ -693,8 +693,7 @@ unpin_out: /** * i915_switch_context() - perform a GPU context switch. - * @ring: ring for which we'll execute the context switch - * @to: the context to switch to + * @req: request for which we'll execute the context switch * * The context life cycle is simple. The context refcount is incremented and * decremented by 1 and create and destroy. If the context is in use by the GPU, @@ -705,25 +704,25 @@ unpin_out: * switched by writing to the ELSP and requests keep a reference to their * context. */ -int i915_switch_context(struct intel_engine_cs *ring, - struct intel_context *to) +int i915_switch_context(struct drm_i915_gem_request *req) { + struct intel_engine_cs *ring = req->ring; struct drm_i915_private *dev_priv = ring->dev->dev_private; WARN_ON(i915.enable_execlists); WARN_ON(!mutex_is_locked(&dev_priv->dev->struct_mutex)); - if (to->legacy_hw_ctx.rcs_state == NULL) { /* We have the fake context */ - if (to != ring->last_context) { - i915_gem_context_reference(to); + if (req->ctx->legacy_hw_ctx.rcs_state == NULL) { /* We have the fake context */ + if (req->ctx != ring->last_context) { + i915_gem_context_reference(req->ctx); if (ring->last_context) i915_gem_context_unreference(ring->last_context); - ring->last_context = to; + ring->last_context = req->ctx; } return 0; } - return do_switch(ring, to); + return do_switch(req->ring, req->ctx); } static bool contexts_enabled(struct drm_device *dev) diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index 2cd0579..1e2fc80 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c @@ -1190,7 +1190,7 @@ i915_gem_ringbuffer_submission(struct i915_execbuffer_params *params, if (ret) goto error; - ret = i915_switch_context(ring, params->ctx); + ret = i915_switch_context(params->request); if (ret) goto error;