[PATCH 40/48] context-barrier-task
Chris Wilson
chris at chris-wilson.co.uk
Fri Feb 1 22:19:55 UTC 2019
---
drivers/gpu/drm/i915/i915_gem_context.c | 61 +++++++++++++++++++++++++
1 file changed, 61 insertions(+)
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index 3ae1609a418a..ecd470d55d51 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -685,6 +685,67 @@ last_request_on_engine(struct i915_timeline *timeline,
return NULL;
}
+struct context_barrier_task {
+ struct i915_active base;
+ void (*task)(void *data);
+ void *data;
+};
+
+static void cb_retire(struct i915_active *base)
+{
+ struct context_barrier_task *cb = container_of(base, typeof(*cb), base);
+
+ if (cb->task)
+ cb->task(cb->data);
+
+ i915_active_fini(&cb->base);
+ kfree(cb);
+}
+
+static int context_barrier_task(struct i915_gem_context *ctx,
+ unsigned long engines,
+ void (*task)(void *data),
+ void *data)
+{
+ struct drm_i915_private *i915 = ctx->i915;
+ struct context_barrier_task *cb;
+ struct intel_context *ce;
+ int err = 0;
+
+ lockdep_assert_held(&i915->drm.struct_mutex);
+ GEM_BUG_ON(!task);
+
+ cb = kmalloc(sizeof(*cb), GFP_KERNEL);
+ if (!cb)
+ return -ENOMEM;
+
+ i915_active_init(i915, &cb->base, cb_retire);
+ cb->task = task;
+ cb->data = data;
+
+ i915_active_acquire(&cb->base);
+ list_for_each_entry(ce, &ctx->active_engines, active_link) {
+ struct intel_engine_cs *engine = ce->engine;
+ struct i915_request *rq;
+
+ if (!(ce->engine->mask & engines))
+ continue;
+
+ rq = i915_request_alloc(engine, ctx);
+ if (IS_ERR(rq)) {
+ cb->task = NULL; /* caller need to unwind instead */
+ err = PTR_ERR(rq);
+ break;
+ }
+
+ i915_active_ref(&cb->base, rq->fence.context, rq);
+ i915_request_add(rq);
+ }
+ i915_active_release(&cb->base);
+
+ return err;
+}
+
int i915_gem_switch_to_kernel_context(struct drm_i915_private *i915,
unsigned long mask)
{
--
2.20.1
More information about the Intel-gfx-trybot
mailing list