[Intel-gfx] [PATCH 11/53] drm/i915/bdw: Allocate ringbuffers for Logical Ring Contexts
Volkin, Bradley D
bradley.d.volkin at intel.com
Thu Jun 19 00:19:08 CEST 2014
On Fri, Jun 13, 2014 at 08:37:29AM -0700, oscar.mateo at intel.com wrote:
> From: Oscar Mateo <oscar.mateo at intel.com>
>
> As we have said a couple of times by now, logical ring contexts have
> their own ringbuffers: not only the backing pages, but the whole
> management struct.
>
> In a previous version of the series, this was achieved with two separate
> patches:
> drm/i915/bdw: Allocate ringbuffer backing objects for default global LRC
> drm/i915/bdw: Allocate ringbuffer for user-created LRCs
>
> Signed-off-by: Oscar Mateo <oscar.mateo at intel.com>
> ---
> drivers/gpu/drm/i915/i915_drv.h | 1 +
> drivers/gpu/drm/i915/intel_lrc.c | 38 ++++++++++++++++++++++++++++++++++++++
> 2 files changed, 39 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 347308e..79799d8 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -599,6 +599,7 @@ struct intel_context {
> /* Execlists */
> struct {
> struct drm_i915_gem_object *obj;
> + struct intel_ringbuffer *ringbuf;
> } engine[I915_NUM_RINGS];
>
> struct i915_ctx_hang_stats hang_stats;
> diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
> index 952212f..b3a23e0 100644
> --- a/drivers/gpu/drm/i915/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/intel_lrc.c
> @@ -60,7 +60,11 @@ void intel_lr_context_free(struct intel_context *ctx)
>
> for (i = 0; i < I915_NUM_RINGS; i++) {
> struct drm_i915_gem_object *ctx_obj = ctx->engine[i].obj;
> + struct intel_ringbuffer *ringbuf = ctx->engine[i].ringbuf;
> +
> if (ctx_obj) {
> + intel_destroy_ring_buffer(ringbuf);
> + kfree(ringbuf);
> i915_gem_object_ggtt_unpin(ctx_obj);
> drm_gem_object_unreference(&ctx_obj->base);
> }
> @@ -94,6 +98,7 @@ int intel_lr_context_deferred_create(struct intel_context *ctx,
> struct drm_device *dev = ring->dev;
> struct drm_i915_gem_object *ctx_obj;
> uint32_t context_size;
> + struct intel_ringbuffer *ringbuf;
> int ret;
>
> WARN_ON(ctx->render_obj != NULL);
> @@ -114,6 +119,39 @@ int intel_lr_context_deferred_create(struct intel_context *ctx,
> return ret;
> }
>
> + ringbuf = kzalloc(sizeof(*ringbuf), GFP_KERNEL);
> + if (!ringbuf) {
> + DRM_DEBUG_DRIVER("Failed to allocate ringbuffer %s\n",
> + ring->name);
> + i915_gem_object_ggtt_unpin(ctx_obj);
> + drm_gem_object_unreference(&ctx_obj->base);
> + ret = -ENOMEM;
> + return ret;
> + }
> +
> + ringbuf->size = 32 * PAGE_SIZE;
> + ringbuf->effective_size = ringbuf->size;
> + ringbuf->head = 0;
> + ringbuf->tail = 0;
> + ringbuf->space = ringbuf->size;
> + ringbuf->last_retired_head = -1;
> +
> + /* TODO: For now we put this in the mappable region so that we can reuse
> + * the existing ringbuffer code which ioremaps it. When we start
> + * creating many contexts, this will no longer work and we must switch
> + * to a kmapish interface.
> + */
It looks like this comment still exists at the end of the series. Does it
still apply or did we find that this is not an issue?
Brad
> + ret = intel_allocate_ring_buffer(dev, ringbuf);
> + if (ret) {
> + DRM_DEBUG_DRIVER("Failed to allocate ringbuffer obj %s: %d\n",
> + ring->name, ret);
> + kfree(ringbuf);
> + i915_gem_object_ggtt_unpin(ctx_obj);
> + drm_gem_object_unreference(&ctx_obj->base);
> + return ret;
> + }
> +
> + ctx->engine[ring->id].ringbuf = ringbuf;
> ctx->engine[ring->id].obj = ctx_obj;
>
> return 0;
> --
> 1.9.0
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
More information about the Intel-gfx
mailing list