From: Ben Widawsky <ben@bwidawsk.net>
To: Daniel Vetter <daniel@ffwll.ch>
Cc: Intel GFX <intel-gfx@lists.freedesktop.org>
Subject: Re: [PATCH 06/12] drm/i915: Use the new vm [un]bind functions
Date: Fri, 26 Jul 2013 14:48:32 -0700 [thread overview]
Message-ID: <20130726214832.GC20047@bwidawsk.net> (raw)
In-Reply-To: <20130723165442.GK5939@phenom.ffwll.local>
On Tue, Jul 23, 2013 at 06:54:43PM +0200, Daniel Vetter wrote:
> On Sun, Jul 21, 2013 at 07:08:13PM -0700, Ben Widawsky wrote:
> > Building on the last patch which created the new function pointers in
> > the VM for bind/unbind, here we actually put those new function pointers
> > to use.
> >
> > Split out as a separate patch to aid in review. I'm fine with squashing
> > into the previous patch if people request it.
> >
> > v2: Updated to address the smart ggtt which can do aliasing as needed
> > Make sure we bind to global gtt when mappable and fenceable. I thought
> > we could get away without this initialy, but we cannot.
> >
> > Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
>
> Meta review on the patch split: If you create new functions in a prep
> patch, then switch and then kill the old functions it's much harder to
> review whether any unwanted functional changes have been introduced.
> Reviewers have to essentially keep both the old and new code open and
> compare by hand. And generally the really hard regression in gem have
> been due to such deeply-hidden accidental changes, and we frankly don't
> yet have the test coverage to just gloss over this.
>
> If you instead first prepare the existing functions by changing the
> arguments and logic, and then once everything is in place switch over to
> vfuncs in the 2nd patch changes will be in-place. In-place changes are
> much easier to review since diff compresses away unchanged parts.
>
> Second reason for this approach is that the functions stay at the same
> place in the source code file, which reduces the amount of spurious
> conflicts when rebasing a large set of patches around such changes ...
>
> I need to ponder this more.
> -Daniel
ping
>
> > ---
> > drivers/gpu/drm/i915/i915_drv.h | 10 ------
> > drivers/gpu/drm/i915/i915_gem.c | 37 +++++++++------------
> > drivers/gpu/drm/i915/i915_gem_context.c | 7 ++--
> > drivers/gpu/drm/i915/i915_gem_execbuffer.c | 29 ++++++++--------
> > drivers/gpu/drm/i915/i915_gem_gtt.c | 53 ++----------------------------
> > 5 files changed, 37 insertions(+), 99 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> > index f3f2825..8d6aa34 100644
> > --- a/drivers/gpu/drm/i915/i915_drv.h
> > +++ b/drivers/gpu/drm/i915/i915_drv.h
> > @@ -1933,18 +1933,8 @@ int i915_gem_context_destroy_ioctl(struct drm_device *dev, void *data,
> >
> > /* i915_gem_gtt.c */
> > void i915_gem_cleanup_aliasing_ppgtt(struct drm_device *dev);
> > -void i915_ppgtt_bind_object(struct i915_hw_ppgtt *ppgtt,
> > - struct drm_i915_gem_object *obj,
> > - enum i915_cache_level cache_level);
> > -void i915_ppgtt_unbind_object(struct i915_hw_ppgtt *ppgtt,
> > - struct drm_i915_gem_object *obj);
> > -
> > void i915_gem_restore_gtt_mappings(struct drm_device *dev);
> > int __must_check i915_gem_gtt_prepare_object(struct drm_i915_gem_object *obj);
> > -/* FIXME: this is never okay with full PPGTT */
> > -void i915_gem_gtt_bind_object(struct drm_i915_gem_object *obj,
> > - enum i915_cache_level cache_level);
> > -void i915_gem_gtt_unbind_object(struct drm_i915_gem_object *obj);
> > void i915_gem_gtt_finish_object(struct drm_i915_gem_object *obj);
> > void i915_gem_init_global_gtt(struct drm_device *dev);
> > void i915_gem_setup_global_gtt(struct drm_device *dev, unsigned long start,
> > diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> > index 9ea6424..63297d7 100644
> > --- a/drivers/gpu/drm/i915/i915_gem.c
> > +++ b/drivers/gpu/drm/i915/i915_gem.c
> > @@ -2653,12 +2653,9 @@ i915_gem_object_unbind(struct drm_i915_gem_object *obj,
> >
> > trace_i915_gem_object_unbind(obj, vm);
> >
> > - if (obj->has_global_gtt_mapping && i915_is_ggtt(vm))
> > - i915_gem_gtt_unbind_object(obj);
> > - if (obj->has_aliasing_ppgtt_mapping) {
> > - i915_ppgtt_unbind_object(dev_priv->mm.aliasing_ppgtt, obj);
> > - obj->has_aliasing_ppgtt_mapping = 0;
> > - }
> > + vma = i915_gem_obj_to_vma(obj, vm);
> > + vm->unmap_vma(vma);
> > +
> > i915_gem_gtt_finish_object(obj);
> > i915_gem_object_unpin_pages(obj);
> >
> > @@ -2666,7 +2663,6 @@ i915_gem_object_unbind(struct drm_i915_gem_object *obj,
> > if (i915_is_ggtt(vm))
> > obj->map_and_fenceable = true;
> >
> > - vma = i915_gem_obj_to_vma(obj, vm);
> > list_del(&vma->mm_list);
> > list_del(&vma->vma_link);
> > drm_mm_remove_node(&vma->node);
> > @@ -3372,7 +3368,6 @@ int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,
> > enum i915_cache_level cache_level)
> > {
> > struct drm_device *dev = obj->base.dev;
> > - drm_i915_private_t *dev_priv = dev->dev_private;
> > struct i915_vma *vma = i915_gem_obj_to_vma(obj, vm);
> > int ret;
> >
> > @@ -3407,13 +3402,8 @@ int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,
> > return ret;
> > }
> >
> > - if (obj->has_global_gtt_mapping)
> > - i915_gem_gtt_bind_object(obj, cache_level);
> > - if (obj->has_aliasing_ppgtt_mapping)
> > - i915_ppgtt_bind_object(dev_priv->mm.aliasing_ppgtt,
> > - obj, cache_level);
> > -
> > - i915_gem_obj_set_color(obj, vma->vm, cache_level);
> > + vm->map_vma(vma, cache_level, 0);
> > + i915_gem_obj_set_color(obj, vm, cache_level);
> > }
> >
> > if (cache_level == I915_CACHE_NONE) {
> > @@ -3695,6 +3685,8 @@ i915_gem_object_pin(struct drm_i915_gem_object *obj,
> > bool map_and_fenceable,
> > bool nonblocking)
> > {
> > + const u32 flags = map_and_fenceable ? GLOBAL_BIND : 0;
> > + struct i915_vma *vma;
> > int ret;
> >
> > if (WARN_ON(obj->pin_count == DRM_I915_GEM_OBJECT_MAX_PIN_COUNT))
> > @@ -3702,6 +3694,7 @@ i915_gem_object_pin(struct drm_i915_gem_object *obj,
> >
> > WARN_ON(map_and_fenceable && !i915_is_ggtt(vm));
> >
> > + /* FIXME: Use vma for bounds check */
> > if (i915_gem_obj_bound(obj, vm)) {
> > if ((alignment &&
> > i915_gem_obj_offset(obj, vm) & (alignment - 1)) ||
> > @@ -3720,20 +3713,22 @@ i915_gem_object_pin(struct drm_i915_gem_object *obj,
> > }
> >
> > if (!i915_gem_obj_bound(obj, vm)) {
> > - struct drm_i915_private *dev_priv = obj->base.dev->dev_private;
> > -
> > ret = i915_gem_object_bind_to_vm(obj, vm, alignment,
> > map_and_fenceable,
> > nonblocking);
> > if (ret)
> > return ret;
> >
> > - if (!dev_priv->mm.aliasing_ppgtt)
> > - i915_gem_gtt_bind_object(obj, obj->cache_level);
> > - }
> > + vma = i915_gem_obj_to_vma(obj, vm);
> > + vm->map_vma(vma, obj->cache_level, flags);
> > + } else
> > + vma = i915_gem_obj_to_vma(obj, vm);
> >
> > + /* Objects are created map and fenceable. If we bind an object
> > + * the first time, and we had aliasing PPGTT (and didn't request
> > + * GLOBAL), we'll need to do this on the second bind.*/
> > if (!obj->has_global_gtt_mapping && map_and_fenceable)
> > - i915_gem_gtt_bind_object(obj, obj->cache_level);
> > + vm->map_vma(vma, obj->cache_level, GLOBAL_BIND);
> >
> > obj->pin_count++;
> > obj->pin_mappable |= map_and_fenceable;
> > diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
> > index 873577d..cc7c0b4 100644
> > --- a/drivers/gpu/drm/i915/i915_gem_context.c
> > +++ b/drivers/gpu/drm/i915/i915_gem_context.c
> > @@ -417,8 +417,11 @@ static int do_switch(struct i915_hw_context *to)
> > return ret;
> > }
> >
> > - if (!to->obj->has_global_gtt_mapping)
> > - i915_gem_gtt_bind_object(to->obj, to->obj->cache_level);
> > + if (!to->obj->has_global_gtt_mapping) {
> > + struct i915_vma *vma = i915_gem_obj_to_vma(to->obj,
> > + &dev_priv->gtt.base);
> > + vma->vm->map_vma(vma, to->obj->cache_level, GLOBAL_BIND);
> > + }
> >
> > if (!to->is_initialized || is_default_context(to))
> > hw_flags |= MI_RESTORE_INHIBIT;
> > diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> > index 8d2643b..6359ef2 100644
> > --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> > +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> > @@ -197,8 +197,9 @@ i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj,
> > if (unlikely(IS_GEN6(dev) &&
> > reloc->write_domain == I915_GEM_DOMAIN_INSTRUCTION &&
> > !target_i915_obj->has_global_gtt_mapping)) {
> > - i915_gem_gtt_bind_object(target_i915_obj,
> > - target_i915_obj->cache_level);
> > + struct i915_vma *vma = i915_gem_obj_to_vma(obj, vm);
> > + vma->vm->map_vma(vma, target_i915_obj->cache_level,
> > + GLOBAL_BIND);
> > }
> >
> > /* Validate that the target is in a valid r/w GPU domain */
> > @@ -404,10 +405,12 @@ i915_gem_execbuffer_reserve_object(struct drm_i915_gem_object *obj,
> > struct i915_address_space *vm,
> > bool *need_reloc)
> > {
> > - struct drm_i915_private *dev_priv = obj->base.dev->dev_private;
> > struct drm_i915_gem_exec_object2 *entry = obj->exec_entry;
> > bool has_fenced_gpu_access = INTEL_INFO(ring->dev)->gen < 4;
> > bool need_fence, need_mappable;
> > + u32 flags = (entry->flags & EXEC_OBJECT_NEEDS_GTT) &&
> > + !obj->has_global_gtt_mapping ? GLOBAL_BIND : 0;
> > + struct i915_vma *vma;
> > int ret;
> >
> > need_fence =
> > @@ -421,6 +424,7 @@ i915_gem_execbuffer_reserve_object(struct drm_i915_gem_object *obj,
> > if (ret)
> > return ret;
> >
> > + vma = i915_gem_obj_to_vma(obj, vm);
> > entry->flags |= __EXEC_OBJECT_HAS_PIN;
> >
> > if (has_fenced_gpu_access) {
> > @@ -436,14 +440,6 @@ i915_gem_execbuffer_reserve_object(struct drm_i915_gem_object *obj,
> > }
> > }
> >
> > - /* Ensure ppgtt mapping exists if needed */
> > - if (dev_priv->mm.aliasing_ppgtt && !obj->has_aliasing_ppgtt_mapping) {
> > - i915_ppgtt_bind_object(dev_priv->mm.aliasing_ppgtt,
> > - obj, obj->cache_level);
> > -
> > - obj->has_aliasing_ppgtt_mapping = 1;
> > - }
> > -
> > if (entry->offset != i915_gem_obj_offset(obj, vm)) {
> > entry->offset = i915_gem_obj_offset(obj, vm);
> > *need_reloc = true;
> > @@ -454,9 +450,7 @@ i915_gem_execbuffer_reserve_object(struct drm_i915_gem_object *obj,
> > obj->base.pending_write_domain = I915_GEM_DOMAIN_RENDER;
> > }
> >
> > - if (entry->flags & EXEC_OBJECT_NEEDS_GTT &&
> > - !obj->has_global_gtt_mapping)
> > - i915_gem_gtt_bind_object(obj, obj->cache_level);
> > + vm->map_vma(vma, obj->cache_level, flags);
> >
> > return 0;
> > }
> > @@ -1047,8 +1041,11 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
> > * batch" bit. Hence we need to pin secure batches into the global gtt.
> > * hsw should have this fixed, but let's be paranoid and do it
> > * unconditionally for now. */
> > - if (flags & I915_DISPATCH_SECURE && !batch_obj->has_global_gtt_mapping)
> > - i915_gem_gtt_bind_object(batch_obj, batch_obj->cache_level);
> > + if (flags & I915_DISPATCH_SECURE &&
> > + !batch_obj->has_global_gtt_mapping) {
> > + struct i915_vma *vma = i915_gem_obj_to_vma(batch_obj, vm);
> > + vm->map_vma(vma, batch_obj->cache_level, GLOBAL_BIND);
> > + }
> >
> > ret = i915_gem_execbuffer_move_to_gpu(ring, &eb->objects);
> > if (ret)
> > diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
> > index 03e6179..1de49a0 100644
> > --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> > +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> > @@ -414,18 +414,6 @@ void i915_gem_cleanup_aliasing_ppgtt(struct drm_device *dev)
> > dev_priv->mm.aliasing_ppgtt = NULL;
> > }
> >
> > -void i915_ppgtt_bind_object(struct i915_hw_ppgtt *ppgtt,
> > - struct drm_i915_gem_object *obj,
> > - enum i915_cache_level cache_level)
> > -{
> > - struct i915_address_space *vm = &ppgtt->base;
> > - unsigned long obj_offset = i915_gem_obj_offset(obj, vm);
> > -
> > - vm->insert_entries(vm, obj->pages,
> > - obj_offset >> PAGE_SHIFT,
> > - cache_level);
> > -}
> > -
> > static void __always_unused gen6_ppgtt_map_vma(struct i915_vma *vma,
> > enum i915_cache_level cache_level,
> > u32 flags)
> > @@ -437,16 +425,6 @@ static void __always_unused gen6_ppgtt_map_vma(struct i915_vma *vma,
> > gen6_ppgtt_insert_entries(vma->vm, vma->obj->pages, entry, cache_level);
> > }
> >
> > -void i915_ppgtt_unbind_object(struct i915_hw_ppgtt *ppgtt,
> > - struct drm_i915_gem_object *obj)
> > -{
> > - struct i915_address_space *vm = &ppgtt->base;
> > - unsigned long obj_offset = i915_gem_obj_offset(obj, vm);
> > -
> > - vm->clear_range(vm, obj_offset >> PAGE_SHIFT,
> > - obj->base.size >> PAGE_SHIFT);
> > -}
> > -
> > static void __always_unused gen6_ppgtt_unmap_vma(struct i915_vma *vma)
> > {
> > const unsigned long entry = vma->node.start >> PAGE_SHIFT;
> > @@ -507,8 +485,10 @@ void i915_gem_restore_gtt_mappings(struct drm_device *dev)
> > gen6_write_pdes(dev_priv->mm.aliasing_ppgtt);
> >
> > list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) {
> > + struct i915_vma *vma = i915_gem_obj_to_vma(obj,
> > + &dev_priv->gtt.base);
> > i915_gem_clflush_object(obj);
> > - i915_gem_gtt_bind_object(obj, obj->cache_level);
> > + vma->vm->map_vma(vma, obj->cache_level, 0);
> > }
> >
> > i915_gem_chipset_flush(dev);
> > @@ -664,33 +644,6 @@ static void gen6_ggtt_map_vma(struct i915_vma *vma,
> > }
> > }
> >
> > -void i915_gem_gtt_bind_object(struct drm_i915_gem_object *obj,
> > - enum i915_cache_level cache_level)
> > -{
> > - struct drm_device *dev = obj->base.dev;
> > - struct drm_i915_private *dev_priv = dev->dev_private;
> > - const unsigned long entry = i915_gem_obj_ggtt_offset(obj) >> PAGE_SHIFT;
> > -
> > - dev_priv->gtt.base.insert_entries(&dev_priv->gtt.base, obj->pages,
> > - entry,
> > - cache_level);
> > -
> > - obj->has_global_gtt_mapping = 1;
> > -}
> > -
> > -void i915_gem_gtt_unbind_object(struct drm_i915_gem_object *obj)
> > -{
> > - struct drm_device *dev = obj->base.dev;
> > - struct drm_i915_private *dev_priv = dev->dev_private;
> > - const unsigned long entry = i915_gem_obj_ggtt_offset(obj) >> PAGE_SHIFT;
> > -
> > - dev_priv->gtt.base.clear_range(&dev_priv->gtt.base,
> > - entry,
> > - obj->base.size >> PAGE_SHIFT);
> > -
> > - obj->has_global_gtt_mapping = 0;
> > -}
> > -
> > static void gen6_ggtt_unmap_vma(struct i915_vma *vma)
> > {
> > struct drm_device *dev = vma->vm->dev;
> > --
> > 1.8.3.3
> >
> > _______________________________________________
> > Intel-gfx mailing list
> > Intel-gfx@lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>
> --
> Daniel Vetter
> Software Engineer, Intel Corporation
> +41 (0) 79 365 57 48 - http://blog.ffwll.ch
--
Ben Widawsky, Intel Open Source Technology Center
next prev parent reply other threads:[~2013-07-26 21:48 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-22 2:08 [PATCH 00/12] Completion of i915 VMAs Ben Widawsky
2013-07-22 2:08 ` [PATCH 01/12] drm/i915: plumb VM into object operations Ben Widawsky
2013-07-23 16:37 ` Daniel Vetter
2013-07-26 9:51 ` Maintainer-review fluff (was: Re: [PATCH 01/12] drm/i915: plumb VM into object operations) Daniel Vetter
2013-07-26 16:59 ` Jesse Barnes
2013-07-26 17:08 ` Chris Wilson
2013-07-26 17:12 ` Jesse Barnes
2013-08-04 20:31 ` Daniel Vetter
2013-07-26 17:40 ` Daniel Vetter
2013-07-26 20:15 ` Ben Widawsky
2013-07-26 20:43 ` Daniel Vetter
2013-07-26 23:13 ` Dave Airlie
2013-07-27 0:05 ` Ben Widawsky
2013-07-27 8:52 ` Dave Airlie
2013-08-04 19:55 ` Daniel Vetter
2013-07-29 22:35 ` Jesse Barnes
2013-07-29 23:50 ` Dave Airlie
2013-08-04 20:17 ` Daniel Vetter
2013-08-05 21:33 ` Jesse Barnes
2013-08-05 22:19 ` Daniel Vetter
2013-08-05 23:34 ` Jesse Barnes
2013-08-06 6:29 ` Daniel Vetter
2013-08-06 14:50 ` Paulo Zanoni
2013-08-06 17:06 ` Daniel Vetter
2013-08-06 23:28 ` Dave Airlie
2013-07-22 2:08 ` [PATCH 02/12] drm/i915: Fix up map and fenceable for VMA Ben Widawsky
2013-07-23 16:42 ` Daniel Vetter
2013-07-23 18:14 ` Ben Widawsky
2013-07-22 2:08 ` [PATCH 03/12] drm/i915: Update error capture for VMs Ben Widawsky
2013-07-22 2:08 ` [PATCH 04/12] drm/i915: Track active by VMA instead of object Ben Widawsky
2013-07-23 16:48 ` Daniel Vetter
2013-07-26 21:48 ` Ben Widawsky
2013-07-22 2:08 ` [PATCH 05/12] drm/i915: Add map/unmap object functions to VM Ben Widawsky
2013-07-22 2:08 ` [PATCH 06/12] drm/i915: Use the new vm [un]bind functions Ben Widawsky
2013-07-23 16:54 ` Daniel Vetter
2013-07-26 21:48 ` Ben Widawsky [this message]
2013-07-26 21:56 ` Daniel Vetter
2013-07-22 2:08 ` [PATCH 07/12] drm/i915: eliminate vm->insert_entries() Ben Widawsky
2013-07-23 16:57 ` Daniel Vetter
2013-07-22 2:08 ` [PATCH 08/12] drm/i915: Add vma to list at creation Ben Widawsky
2013-07-22 2:08 ` [PATCH 09/12] drm/i915: create vmas at execbuf Ben Widawsky
2013-07-22 13:32 ` Chris Wilson
2013-07-22 2:08 ` [PATCH 10/12] drm/i915: Convert execbuf code to use vmas Ben Widawsky
2013-07-22 2:08 ` [PATCH 11/12] drm/i915: Convert object coloring to VMA Ben Widawsky
2013-07-23 17:07 ` Daniel Vetter
2013-07-22 2:08 ` [PATCH 12/12] drm/i915: Convert active API " Ben Widawsky
2013-07-22 10:42 ` [PATCH 00/12] Completion of i915 VMAs Chris Wilson
2013-07-22 16:35 ` Ben Widawsky
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20130726214832.GC20047@bwidawsk.net \
--to=ben@bwidawsk.net \
--cc=daniel@ffwll.ch \
--cc=intel-gfx@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.