From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Volkin, Bradley D" Subject: Re: [PATCH 11/53] drm/i915/bdw: Allocate ringbuffers for Logical Ring Contexts Date: Wed, 18 Jun 2014 15:19:08 -0700 Message-ID: <20140618221908.GC5716@bdvolkin-ubuntu-desktop> References: <1402673891-14618-1-git-send-email-oscar.mateo@intel.com> <1402673891-14618-12-git-send-email-oscar.mateo@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mga03.intel.com (mga03.intel.com [143.182.124.21]) by gabe.freedesktop.org (Postfix) with ESMTP id 193CF8A16C for ; Wed, 18 Jun 2014 15:18:38 -0700 (PDT) Content-Disposition: inline In-Reply-To: <1402673891-14618-12-git-send-email-oscar.mateo@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: "oscar.mateo@intel.com" Cc: "intel-gfx@lists.freedesktop.org" List-Id: intel-gfx@lists.freedesktop.org On Fri, Jun 13, 2014 at 08:37:29AM -0700, oscar.mateo@intel.com wrote: > From: Oscar Mateo > > 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 > --- > 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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/intel-gfx