mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-04 18:19:28 +09:00
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: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Reviewed-by: Thomas Hellström <thomas.hellstrom@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20200819140904.1708856-11-maarten.lankhorst@linux.intel.com Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
This commit is contained in:
committed by
Joonas Lahtinen
parent
bfdf8b1d38
commit
99f08d674e
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user