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

drm/i915: Add ww context handling to context_barrier_task

This is required if we want to pass a ww context in intel_context_pin
and gen6_ppgtt_pin().
Signed-off-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: default avatarThomas Hellström <thomas.hellstrom@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200819140904.1708856-11-maarten.lankhorst@linux.intel.comSigned-off-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
parent bfdf8b1d
...@@ -1106,6 +1106,7 @@ I915_SELFTEST_DECLARE(static intel_engine_mask_t context_barrier_inject_fault); ...@@ -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, static int context_barrier_task(struct i915_gem_context *ctx,
intel_engine_mask_t engines, intel_engine_mask_t engines,
bool (*skip)(struct intel_context *ce, void *data), 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), int (*emit)(struct i915_request *rq, void *data),
void (*task)(void *data), void (*task)(void *data),
void *data) void *data)
...@@ -1113,6 +1114,7 @@ static int context_barrier_task(struct i915_gem_context *ctx, ...@@ -1113,6 +1114,7 @@ static int context_barrier_task(struct i915_gem_context *ctx,
struct context_barrier_task *cb; struct context_barrier_task *cb;
struct i915_gem_engines_iter it; struct i915_gem_engines_iter it;
struct i915_gem_engines *e; struct i915_gem_engines *e;
struct i915_gem_ww_ctx ww;
struct intel_context *ce; struct intel_context *ce;
int err = 0; int err = 0;
...@@ -1150,10 +1152,21 @@ static int context_barrier_task(struct i915_gem_context *ctx, ...@@ -1150,10 +1152,21 @@ static int context_barrier_task(struct i915_gem_context *ctx,
if (skip && skip(ce, data)) if (skip && skip(ce, data))
continue; 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)) { if (IS_ERR(rq)) {
err = PTR_ERR(rq); err = PTR_ERR(rq);
break; goto err_unpin;
} }
err = 0; err = 0;
...@@ -1163,6 +1176,16 @@ static int context_barrier_task(struct i915_gem_context *ctx, ...@@ -1163,6 +1176,16 @@ static int context_barrier_task(struct i915_gem_context *ctx,
err = i915_active_add_request(&cb->base, rq); err = i915_active_add_request(&cb->base, rq);
i915_request_add(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) if (err)
break; break;
} }
...@@ -1218,6 +1241,17 @@ static void set_ppgtt_barrier(void *data) ...@@ -1218,6 +1241,17 @@ static void set_ppgtt_barrier(void *data)
i915_vm_close(old); 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) static int emit_ppgtt_update(struct i915_request *rq, void *data)
{ {
struct i915_address_space *vm = rq->context->vm; struct i915_address_space *vm = rq->context->vm;
...@@ -1274,20 +1308,10 @@ static int emit_ppgtt_update(struct i915_request *rq, void *data) ...@@ -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) 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)) if (HAS_LOGICAL_RING_CONTEXTS(ce->engine->i915))
return false; return !ce->state;
else
if (!atomic_read(&ce->pin_count)) return !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;
} }
static int set_ppgtt(struct drm_i915_file_private *file_priv, 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, ...@@ -1338,6 +1362,7 @@ static int set_ppgtt(struct drm_i915_file_private *file_priv,
*/ */
err = context_barrier_task(ctx, ALL_ENGINES, err = context_barrier_task(ctx, ALL_ENGINES,
skip_ppgtt_update, skip_ppgtt_update,
pin_ppgtt_update,
emit_ppgtt_update, emit_ppgtt_update,
set_ppgtt_barrier, set_ppgtt_barrier,
old); old);
......
...@@ -1920,8 +1920,8 @@ static int mock_context_barrier(void *arg) ...@@ -1920,8 +1920,8 @@ static int mock_context_barrier(void *arg)
return -ENOMEM; return -ENOMEM;
counter = 0; counter = 0;
err = context_barrier_task(ctx, 0, err = context_barrier_task(ctx, 0, NULL, NULL, NULL,
NULL, NULL, mock_barrier_task, &counter); mock_barrier_task, &counter);
if (err) { if (err) {
pr_err("Failed at line %d, err=%d\n", __LINE__, err); pr_err("Failed at line %d, err=%d\n", __LINE__, err);
goto out; goto out;
...@@ -1933,11 +1933,8 @@ static int mock_context_barrier(void *arg) ...@@ -1933,11 +1933,8 @@ static int mock_context_barrier(void *arg)
} }
counter = 0; counter = 0;
err = context_barrier_task(ctx, ALL_ENGINES, err = context_barrier_task(ctx, ALL_ENGINES, skip_unused_engines,
skip_unused_engines, NULL, NULL, mock_barrier_task, &counter);
NULL,
mock_barrier_task,
&counter);
if (err) { if (err) {
pr_err("Failed at line %d, err=%d\n", __LINE__, err); pr_err("Failed at line %d, err=%d\n", __LINE__, err);
goto out; goto out;
...@@ -1957,8 +1954,8 @@ static int mock_context_barrier(void *arg) ...@@ -1957,8 +1954,8 @@ static int mock_context_barrier(void *arg)
counter = 0; counter = 0;
context_barrier_inject_fault = BIT(RCS0); context_barrier_inject_fault = BIT(RCS0);
err = context_barrier_task(ctx, ALL_ENGINES, err = context_barrier_task(ctx, ALL_ENGINES, NULL, NULL, NULL,
NULL, NULL, mock_barrier_task, &counter); mock_barrier_task, &counter);
context_barrier_inject_fault = 0; context_barrier_inject_fault = 0;
if (err == -ENXIO) if (err == -ENXIO)
err = 0; err = 0;
...@@ -1972,11 +1969,8 @@ static int mock_context_barrier(void *arg) ...@@ -1972,11 +1969,8 @@ static int mock_context_barrier(void *arg)
goto out; goto out;
counter = 0; counter = 0;
err = context_barrier_task(ctx, ALL_ENGINES, err = context_barrier_task(ctx, ALL_ENGINES, skip_unused_engines,
skip_unused_engines, NULL, NULL, mock_barrier_task, &counter);
NULL,
mock_barrier_task,
&counter);
if (err) { if (err) {
pr_err("Failed at line %d, err=%d\n", __LINE__, err); pr_err("Failed at line %d, err=%d\n", __LINE__, err);
goto out; goto out;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment