Commit 99f08d67 authored by Maarten Lankhorst's avatar Maarten Lankhorst Committed by Joonas Lahtinen
Browse files

drm/i915: Add ww context handling to context_barrier_task

parent bfdf8b1d
Loading
Loading
Loading
Loading
+40 −15
Original line number Diff line number Diff line
@@ -1106,6 +1106,7 @@ I915_SELFTEST_DECLARE(static intel_engine_mask_t context_barrier_inject_fault);
static int context_barrier_task(struct i915_gem_context *ctx,
				intel_engine_mask_t engines,
				bool (*skip)(struct intel_context *ce, void *data),
				int (*pin)(struct intel_context *ce, struct i915_gem_ww_ctx *ww, void *data),
				int (*emit)(struct i915_request *rq, void *data),
				void (*task)(void *data),
				void *data)
@@ -1113,6 +1114,7 @@ static int context_barrier_task(struct i915_gem_context *ctx,
	struct context_barrier_task *cb;
	struct i915_gem_engines_iter it;
	struct i915_gem_engines *e;
	struct i915_gem_ww_ctx ww;
	struct intel_context *ce;
	int err = 0;

@@ -1150,10 +1152,21 @@ static int context_barrier_task(struct i915_gem_context *ctx,
		if (skip && skip(ce, data))
			continue;

		rq = intel_context_create_request(ce);
		i915_gem_ww_ctx_init(&ww, true);
retry:
		err = intel_context_pin(ce);
		if (err)
			goto err;

		if (pin)
			err = pin(ce, &ww, data);
		if (err)
			goto err_unpin;

		rq = i915_request_create(ce);
		if (IS_ERR(rq)) {
			err = PTR_ERR(rq);
			break;
			goto err_unpin;
		}

		err = 0;
@@ -1163,6 +1176,16 @@ static int context_barrier_task(struct i915_gem_context *ctx,
			err = i915_active_add_request(&cb->base, rq);

		i915_request_add(rq);
err_unpin:
		intel_context_unpin(ce);
err:
		if (err == -EDEADLK) {
			err = i915_gem_ww_ctx_backoff(&ww);
			if (!err)
				goto retry;
		}
		i915_gem_ww_ctx_fini(&ww);

		if (err)
			break;
	}
@@ -1218,6 +1241,17 @@ static void set_ppgtt_barrier(void *data)
	i915_vm_close(old);
}

static int pin_ppgtt_update(struct intel_context *ce, struct i915_gem_ww_ctx *ww, void *data)
{
	struct i915_address_space *vm = ce->vm;

	if (!HAS_LOGICAL_RING_CONTEXTS(vm->i915))
		/* ppGTT is not part of the legacy context image */
		return gen6_ppgtt_pin(i915_vm_to_ppgtt(vm));

	return 0;
}

static int emit_ppgtt_update(struct i915_request *rq, void *data)
{
	struct i915_address_space *vm = rq->context->vm;
@@ -1274,20 +1308,10 @@ static int emit_ppgtt_update(struct i915_request *rq, void *data)

static bool skip_ppgtt_update(struct intel_context *ce, void *data)
{
	if (!test_bit(CONTEXT_ALLOC_BIT, &ce->flags))
		return true;

	if (HAS_LOGICAL_RING_CONTEXTS(ce->engine->i915))
		return false;

	if (!atomic_read(&ce->pin_count))
		return true;

	/* ppGTT is not part of the legacy context image */
	if (gen6_ppgtt_pin(i915_vm_to_ppgtt(ce->vm)))
		return true;

	return false;
		return !ce->state;
	else
		return !atomic_read(&ce->pin_count);
}

static int set_ppgtt(struct drm_i915_file_private *file_priv,
@@ -1338,6 +1362,7 @@ static int set_ppgtt(struct drm_i915_file_private *file_priv,
	 */
	err = context_barrier_task(ctx, ALL_ENGINES,
				   skip_ppgtt_update,
				   pin_ppgtt_update,
				   emit_ppgtt_update,
				   set_ppgtt_barrier,
				   old);
+8 −14
Original line number Diff line number Diff line
@@ -1920,8 +1920,8 @@ static int mock_context_barrier(void *arg)
		return -ENOMEM;

	counter = 0;
	err = context_barrier_task(ctx, 0,
				   NULL, NULL, mock_barrier_task, &counter);
	err = context_barrier_task(ctx, 0, NULL, NULL, NULL,
				   mock_barrier_task, &counter);
	if (err) {
		pr_err("Failed at line %d, err=%d\n", __LINE__, err);
		goto out;
@@ -1933,11 +1933,8 @@ static int mock_context_barrier(void *arg)
	}

	counter = 0;
	err = context_barrier_task(ctx, ALL_ENGINES,
				   skip_unused_engines,
				   NULL,
				   mock_barrier_task,
				   &counter);
	err = context_barrier_task(ctx, ALL_ENGINES, skip_unused_engines,
				   NULL, NULL, mock_barrier_task, &counter);
	if (err) {
		pr_err("Failed at line %d, err=%d\n", __LINE__, err);
		goto out;
@@ -1957,8 +1954,8 @@ static int mock_context_barrier(void *arg)

	counter = 0;
	context_barrier_inject_fault = BIT(RCS0);
	err = context_barrier_task(ctx, ALL_ENGINES,
				   NULL, NULL, mock_barrier_task, &counter);
	err = context_barrier_task(ctx, ALL_ENGINES, NULL, NULL, NULL,
				   mock_barrier_task, &counter);
	context_barrier_inject_fault = 0;
	if (err == -ENXIO)
		err = 0;
@@ -1972,11 +1969,8 @@ static int mock_context_barrier(void *arg)
		goto out;

	counter = 0;
	err = context_barrier_task(ctx, ALL_ENGINES,
				   skip_unused_engines,
				   NULL,
				   mock_barrier_task,
				   &counter);
	err = context_barrier_task(ctx, ALL_ENGINES, skip_unused_engines,
				   NULL, NULL, mock_barrier_task, &counter);
	if (err) {
		pr_err("Failed at line %d, err=%d\n", __LINE__, err);
		goto out;