Commit 75d0a7f3 authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915: Lift timeline into intel_context



Move the timeline from being inside the intel_ring to intel_context
itself. This saves much pointer dancing and makes the relations of the
context to its timeline much clearer.

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarMatthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190809182518.20486-4-chris@chris-wilson.co.uk
parent 48ae397b
Loading
Loading
Loading
Loading
+27 −8
Original line number Diff line number Diff line
@@ -489,6 +489,29 @@ static void __assign_ppgtt(struct i915_gem_context *ctx,
		i915_vm_put(vm);
}

static void __set_timeline(struct intel_timeline **dst,
			   struct intel_timeline *src)
{
	struct intel_timeline *old = *dst;

	*dst = src ? intel_timeline_get(src) : NULL;

	if (old)
		intel_timeline_put(old);
}

static void __apply_timeline(struct intel_context *ce, void *timeline)
{
	__set_timeline(&ce->timeline, timeline);
}

static void __assign_timeline(struct i915_gem_context *ctx,
			      struct intel_timeline *timeline)
{
	__set_timeline(&ctx->timeline, timeline);
	context_apply_all(ctx, __apply_timeline, timeline);
}

static struct i915_gem_context *
i915_gem_create_context(struct drm_i915_private *dev_priv, unsigned int flags)
{
@@ -531,7 +554,8 @@ i915_gem_create_context(struct drm_i915_private *dev_priv, unsigned int flags)
			return ERR_CAST(timeline);
		}

		ctx->timeline = timeline;
		__assign_timeline(ctx, timeline);
		intel_timeline_put(timeline);
	}

	trace_i915_context_create(ctx);
@@ -1931,13 +1955,8 @@ unlock:
static int clone_timeline(struct i915_gem_context *dst,
			  struct i915_gem_context *src)
{
	if (src->timeline) {
		GEM_BUG_ON(src->timeline == dst->timeline);

		if (dst->timeline)
			intel_timeline_put(dst->timeline);
		dst->timeline = intel_timeline_get(src->timeline);
	}
	if (src->timeline)
		__assign_timeline(dst, src->timeline);

	return 0;
}
+1 −1
Original line number Diff line number Diff line
@@ -2182,7 +2182,7 @@ err_unpin:
static void eb_unpin_context(struct i915_execbuffer *eb)
{
	struct intel_context *ce = eb->context;
	struct intel_timeline *tl = ce->ring->timeline;
	struct intel_timeline *tl = ce->timeline;

	mutex_lock(&tl->mutex);
	intel_context_exit(ce);
+16 −5
Original line number Diff line number Diff line
@@ -68,7 +68,7 @@ int __intel_context_do_pin(struct intel_context *ce)
			goto err;

		GEM_TRACE("%s context:%llx pin ring:{head:%04x, tail:%04x}\n",
			  ce->engine->name, ce->ring->timeline->fence_context,
			  ce->engine->name, ce->timeline->fence_context,
			  ce->ring->head, ce->ring->tail);

		i915_gem_context_get(ce->gem_context); /* for ctx->ppgtt */
@@ -98,7 +98,7 @@ void intel_context_unpin(struct intel_context *ce)

	if (likely(atomic_dec_and_test(&ce->pin_count))) {
		GEM_TRACE("%s context:%llx retire\n",
			  ce->engine->name, ce->ring->timeline->fence_context);
			  ce->engine->name, ce->timeline->fence_context);

		ce->ops->unpin(ce);

@@ -143,11 +143,12 @@ static void __intel_context_retire(struct i915_active *active)
	struct intel_context *ce = container_of(active, typeof(*ce), active);

	GEM_TRACE("%s context:%llx retire\n",
		  ce->engine->name, ce->ring->timeline->fence_context);
		  ce->engine->name, ce->timeline->fence_context);

	if (ce->state)
		__context_unpin_state(ce->state);

	intel_timeline_unpin(ce->timeline);
	intel_ring_unpin(ce->ring);
	intel_context_put(ce);
}
@@ -163,15 +164,21 @@ static int __intel_context_active(struct i915_active *active)
	if (err)
		goto err_put;

	err = intel_timeline_pin(ce->timeline);
	if (err)
		goto err_ring;

	if (!ce->state)
		return 0;

	err = __context_pin_state(ce->state);
	if (err)
		goto err_ring;
		goto err_timeline;

	return 0;

err_timeline:
	intel_timeline_unpin(ce->timeline);
err_ring:
	intel_ring_unpin(ce->ring);
err_put:
@@ -218,6 +225,8 @@ intel_context_init(struct intel_context *ce,

	ce->gem_context = ctx;
	ce->vm = i915_vm_get(ctx->vm ?: &engine->gt->ggtt->vm);
	if (ctx->timeline)
		ce->timeline = intel_timeline_get(ctx->timeline);

	ce->engine = engine;
	ce->ops = engine->cops;
@@ -235,6 +244,8 @@ intel_context_init(struct intel_context *ce,

void intel_context_fini(struct intel_context *ce)
{
	if (ce->timeline)
		intel_timeline_put(ce->timeline);
	i915_vm_put(ce->vm);

	mutex_destroy(&ce->pin_mutex);
@@ -279,7 +290,7 @@ void intel_context_exit_engine(struct intel_context *ce)
int intel_context_prepare_remote_request(struct intel_context *ce,
					 struct i915_request *rq)
{
	struct intel_timeline *tl = ce->ring->timeline;
	struct intel_timeline *tl = ce->timeline;
	int err;

	/* Only suitable for use in remotely modifying this context */
+4 −4
Original line number Diff line number Diff line
@@ -120,15 +120,15 @@ static inline void intel_context_put(struct intel_context *ce)

static inline int __must_check
intel_context_timeline_lock(struct intel_context *ce)
	__acquires(&ce->ring->timeline->mutex)
	__acquires(&ce->timeline->mutex)
{
	return mutex_lock_interruptible(&ce->ring->timeline->mutex);
	return mutex_lock_interruptible(&ce->timeline->mutex);
}

static inline void intel_context_timeline_unlock(struct intel_context *ce)
	__releases(&ce->ring->timeline->mutex)
	__releases(&ce->timeline->mutex)
{
	mutex_unlock(&ce->ring->timeline->mutex);
	mutex_unlock(&ce->timeline->mutex);
}

int intel_context_prepare_remote_request(struct intel_context *ce,
+1 −0
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ struct intel_context {

	struct i915_vma *state;
	struct intel_ring *ring;
	struct intel_timeline *timeline;

	unsigned long flags;
#define CONTEXT_ALLOC_BIT 0
Loading