[Intel-gfx] [PATCH 6/7] drm/i915: Only track real ppgtt for a context
Daniel Vetter
daniel at ffwll.ch
Wed Jul 30 23:11:27 CEST 2014
On Wed, Jul 30, 2014 at 09:42:03PM +0200, Daniel Vetter wrote:
> There's a bit a confusion since we track the global gtt,
> the aliasing and real ppgtt in the ctx->vm pointer. And not
> all callers really bother to check for the different cases and just
> presume that it points to a real ppgtt.
>
> Now looking closely we don't actually need ->vm to always point at an
> address space - the only place that cares actually has fixup code
> already to decide whether to look at the per-proces or the global
> address space.
>
> So switch to just tracking the ppgtt directly and ditch all the
> extraneous code.
>
> Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
Jesse looked up the Jira for this one for me, so
OTC-Jira: VIZ-3724
Cheers, Daniel
> ---
> drivers/gpu/drm/i915/i915_debugfs.c | 2 +-
> drivers/gpu/drm/i915/i915_drv.h | 3 +--
> drivers/gpu/drm/i915/i915_gem_context.c | 28 +++++++---------------------
> drivers/gpu/drm/i915/i915_gem_execbuffer.c | 5 +++--
> drivers/gpu/drm/i915/i915_gpu_error.c | 10 +++++++---
> 5 files changed, 19 insertions(+), 29 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
> index 3bf1d20c598b..aaf07e230cb0 100644
> --- a/drivers/gpu/drm/i915/i915_debugfs.c
> +++ b/drivers/gpu/drm/i915/i915_debugfs.c
> @@ -1774,7 +1774,7 @@ static int per_file_ctx(int id, void *ptr, void *data)
> {
> struct intel_context *ctx = ptr;
> struct seq_file *m = data;
> - struct i915_hw_ppgtt *ppgtt = ctx_to_ppgtt(ctx);
> + struct i915_hw_ppgtt *ppgtt = ctx->ppgtt;
>
> if (i915_gem_context_is_default(ctx))
> seq_puts(m, " default context:\n");
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 0762e19f9bc6..3230b08aff13 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -616,7 +616,7 @@ struct intel_context {
> uint8_t remap_slice;
> struct drm_i915_file_private *file_priv;
> struct i915_ctx_hang_stats hang_stats;
> - struct i915_address_space *vm;
> + struct i915_hw_ppgtt *ppgtt;
>
> struct {
> struct drm_i915_gem_object *rcs_state;
> @@ -2504,7 +2504,6 @@ i915_gem_object_ggtt_unbind(struct drm_i915_gem_object *obj)
> void i915_gem_object_ggtt_unpin(struct drm_i915_gem_object *obj);
>
> /* i915_gem_context.c */
> -#define ctx_to_ppgtt(ctx) container_of((ctx)->vm, struct i915_hw_ppgtt, base)
> int __must_check i915_gem_context_init(struct drm_device *dev);
> void i915_gem_context_fini(struct drm_device *dev);
> void i915_gem_context_reset(struct drm_device *dev);
> diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
> index 7a455fcee3a7..c00e5d027774 100644
> --- a/drivers/gpu/drm/i915/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/i915_gem_context.c
> @@ -136,15 +136,8 @@ void i915_gem_context_free(struct kref *ctx_ref)
> {
> struct intel_context *ctx = container_of(ctx_ref,
> typeof(*ctx), ref);
> - struct i915_hw_ppgtt *ppgtt = NULL;
>
> - if (ctx->legacy_hw_ctx.rcs_state) {
> - /* We refcount even the aliasing PPGTT to keep the code symmetric */
> - if (USES_PPGTT(ctx->legacy_hw_ctx.rcs_state->base.dev))
> - ppgtt = ctx_to_ppgtt(ctx);
> - }
> -
> - i915_ppgtt_put(ppgtt);
> + i915_ppgtt_put(ctx->ppgtt);
> if (ctx->legacy_hw_ctx.rcs_state)
> drm_gem_object_unreference(&ctx->legacy_hw_ctx.rcs_state->base);
> list_del(&ctx->link);
> @@ -240,7 +233,6 @@ i915_gem_create_context(struct drm_device *dev,
> bool create_vm)
> {
> const bool is_global_default_ctx = file_priv == NULL;
> - struct drm_i915_private *dev_priv = dev->dev_private;
> struct intel_context *ctx;
> int ret = 0;
>
> @@ -274,15 +266,10 @@ i915_gem_create_context(struct drm_device *dev,
> PTR_ERR(ppgtt));
> ret = PTR_ERR(ppgtt);
> goto err_unpin;
> - } else
> - ctx->vm = &ppgtt->base;
> - } else if (USES_PPGTT(dev)) {
> - /* For platforms which only have aliasing PPGTT, we fake the
> - * address space and refcounting. */
> - ctx->vm = &dev_priv->mm.aliasing_ppgtt->base;
> - i915_ppgtt_get(dev_priv->mm.aliasing_ppgtt);
> - } else
> - ctx->vm = &dev_priv->gtt.base;
> + }
> +
> + ctx->ppgtt = ppgtt;
> + }
>
> return ctx;
>
> @@ -538,7 +525,6 @@ static int do_switch(struct intel_engine_cs *ring,
> {
> struct drm_i915_private *dev_priv = ring->dev->dev_private;
> struct intel_context *from = ring->last_context;
> - struct i915_hw_ppgtt *ppgtt = ctx_to_ppgtt(to);
> u32 hw_flags = 0;
> bool uninitialized = false;
> int ret, i;
> @@ -566,8 +552,8 @@ static int do_switch(struct intel_engine_cs *ring,
> */
> from = ring->last_context;
>
> - if (USES_FULL_PPGTT(ring->dev)) {
> - ret = ppgtt->switch_mm(ppgtt, ring, false);
> + if (to->ppgtt) {
> + ret = to->ppgtt->switch_mm(to->ppgtt, ring, false);
> if (ret)
> goto unpin_out;
> }
> diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> index 60998fc4e5b2..54b3d8c8b228 100644
> --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> @@ -1318,8 +1318,9 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
>
> i915_gem_context_reference(ctx);
>
> - vm = ctx->vm;
> - if (!USES_FULL_PPGTT(dev))
> + if (ctx->ppgtt)
> + vm = &ctx->ppgtt->base;
> + else
> vm = &dev_priv->gtt.base;
>
> eb = eb_create(args);
> diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c
> index 0b3f69439451..06072120b15d 100644
> --- a/drivers/gpu/drm/i915/i915_gpu_error.c
> +++ b/drivers/gpu/drm/i915/i915_gpu_error.c
> @@ -958,6 +958,12 @@ static void i915_gem_record_rings(struct drm_device *dev,
>
> request = i915_gem_find_active_request(ring);
> if (request) {
> + struct i915_address_space *vm;
> +
> + vm = request->ctx && request->ctx->ppgtt ?
> + &request->ctx->ppgtt->base :
> + &dev_priv->gtt.base;
> +
> /* We need to copy these to an anonymous buffer
> * as the simplest method to avoid being overwritten
> * by userspace.
> @@ -965,9 +971,7 @@ static void i915_gem_record_rings(struct drm_device *dev,
> error->ring[i].batchbuffer =
> i915_error_object_create(dev_priv,
> request->batch_obj,
> - request->ctx ?
> - request->ctx->vm :
> - &dev_priv->gtt.base);
> + vm);
>
> if (HAS_BROKEN_CS_TLB(dev_priv->dev) &&
> ring->scratch.obj)
> --
> 1.9.3
>
--
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
More information about the Intel-gfx
mailing list