On ke, 2016-04-20 at 19:42 +0100, Chris Wilson wrote: > Instead of allocating a new request when allocating a context, use the > request that initiated the allocation to emit the context > initialisation. This serves two purposes, it makes the initialisation > atomic with first use (simplifying scheduling and our own error > handling). Secondly, it enables us to remove the explicit context > allocation required by higher levels of GEM and make that property of > execlists opaque (in the next patch). There is also a minor step > forwards towards convergence of legacy/execlist contexts. > > Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> Nitpick below. Reviewed-by: Joonas Lahtinen <joonas.lahtinen@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/i915_drv.h | 1 + > drivers/gpu/drm/i915/intel_lrc.c | 39 ++++++++++++++++++--------------------- > 2 files changed, 19 insertions(+), 21 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > index 2bf3a8f97d52..e4b510bcee62 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -868,6 +868,7 @@ struct intel_context { > struct i915_vma *lrc_vma; > u64 lrc_desc; > uint32_t *lrc_reg_state; > + bool initialised; > } engine[I915_NUM_ENGINES]; > > struct list_head link; > diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c > index 838abd4b42a3..d765267153c5 100644 > --- a/drivers/gpu/drm/i915/intel_lrc.c > +++ b/drivers/gpu/drm/i915/intel_lrc.c > @@ -672,9 +672,10 @@ static int execlists_move_to_gpu(struct drm_i915_gem_request *req, > > int intel_logical_ring_alloc_request_extras(struct drm_i915_gem_request *request) > { > - int ret = 0; > + struct intel_engine_cs *engine = request->engine; > + int ret; > > - request->ringbuf = request->ctx->engine[request->engine->id].ringbuf; > + request->ringbuf = request->ctx->engine[engine->id].ringbuf; > > if (i915.enable_guc_submission) { > /* > @@ -689,7 +690,20 @@ int intel_logical_ring_alloc_request_extras(struct drm_i915_gem_request *request > return ret; > } > > - return intel_lr_context_pin(request->ctx, request->engine); > + ret = intel_lr_context_pin(request->ctx, engine); > + if (ret) > + return ret; > + > + if (!request->ctx->engine[engine->id].initialised) { > + ret = engine->init_context(request); > + if (ret) { > + intel_lr_context_unpin(request->ctx, engine); I prefer the goto teardown path, it's easy to read and modify later on. > + return ret; > + } > + request->ctx->engine[engine->id].initialised = true; > + } > + > + return 0; > } > > static int logical_ring_wait_for_space(struct drm_i915_gem_request *req, > @@ -2634,25 +2648,8 @@ int intel_lr_context_deferred_alloc(struct intel_context *ctx, > > ctx->engine[engine->id].ringbuf = ringbuf; > ctx->engine[engine->id].state = ctx_obj; > + ctx->engine[engine->id].initialised = engine->init_context == NULL; > > - if (ctx != ctx->i915->kernel_context && engine->init_context) { > - struct drm_i915_gem_request *req; > - > - req = i915_gem_request_alloc(engine, ctx); > - if (IS_ERR(req)) { > - ret = PTR_ERR(req); > - DRM_ERROR("ring create req: %d\n", ret); > - goto error_ringbuf; > - } > - > - ret = engine->init_context(req); > - i915_add_request_no_flush(req); > - if (ret) { > - DRM_ERROR("ring init context: %d\n", > - ret); > - goto error_ringbuf; > - } > - } > return 0; > > error_ringbuf: -- Joonas Lahtinen Open Source Technology Center Intel Corporation _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx