Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ae6c4806 authored by Daniel Vetter's avatar Daniel Vetter
Browse files

drm/i915: Only track real ppgtt for a context



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.

v2: Fixup the ppgtt debugfs file to not oops on a NULL ctx->ppgtt.
Also drop the early exit - without aliasing ppgtt we want to dump all
the ppgtts of the contexts if we have full ppgtt.

v3: Actually git add the compile fix.

Reviewed-by: default avatarMichel Thierry <michel.thierry@intel.com>
Cc: "Thierry, Michel" <michel.thierry@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
OTC-Jira: VIZ-3724
[danvet: Resolve conflicts with execlist patches while applying.]
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent fa76da34
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -1821,7 +1821,13 @@ 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 (!ppgtt) {
		seq_printf(m, "  no ppgtt for context %d\n",
			   ctx->user_handle);
		return 0;
	}

	if (i915_gem_context_is_default(ctx))
		seq_puts(m, "  default context:\n");
@@ -1881,8 +1887,7 @@ static void gen6_ppgtt_info(struct seq_file *m, struct drm_device *dev)
		seq_printf(m, "pd gtt offset: 0x%08x\n", ppgtt->pd_offset);

		ppgtt->debug_dump(ppgtt, m);
	} else
		return;
	}

	list_for_each_entry_reverse(file, &dev->filelist, lhead) {
		struct drm_i915_file_private *file_priv = file->driver_priv;
+1 −2
Original line number Diff line number Diff line
@@ -624,7 +624,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;

	/* Legacy ring buffer submission */
	struct {
@@ -2556,7 +2556,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);
+10 −23
Original line number Diff line number Diff line
@@ -136,18 +136,12 @@ 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 (i915.enable_execlists) {
		ppgtt = ctx_to_ppgtt(ctx);
	if (i915.enable_execlists)
		intel_lr_context_free(ctx);
	} else 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);
@@ -243,7 +237,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;

@@ -277,15 +270,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;

@@ -543,7 +531,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;
@@ -571,8 +558,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;
	}
+3 −2
Original line number Diff line number Diff line
@@ -1315,8 +1315,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);
+7 −3
Original line number Diff line number Diff line
@@ -967,6 +967,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.
@@ -974,9 +980,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)
Loading