diff mbox

drm/i915: Relinquish any fence when changing cache levels

Message ID 1302697540-27324-1-git-send-email-chris@chris-wilson.co.uk (mailing list archive)
State New, archived
Headers show

Commit Message

Chris Wilson April 13, 2011, 12:25 p.m. UTC
This is vital to maintain our contract with the hw for not using fences
on snooped memory for older chipsets. It should have no impact
other than clearing the fence register (and updating the fence
bookkeeping) as any future IO access (page faults or pwrite/pread) will
go through the cached CPU domain for older chipsets. On SandyBridge, we
incur an extra get_fence() on the rare path that we need to perform
detiling through a pagefault (i.e. texture transfers).

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/i915_gem.c |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

Comments

Eric Anholt April 13, 2011, 4:36 p.m. UTC | #1
On Wed, 13 Apr 2011 13:25:40 +0100, Chris Wilson <chris@chris-wilson.co.uk> wrote:
> This is vital to maintain our contract with the hw for not using fences
> on snooped memory for older chipsets. It should have no impact
> other than clearing the fence register (and updating the fence
> bookkeeping) as any future IO access (page faults or pwrite/pread) will
> go through the cached CPU domain for older chipsets. On SandyBridge, we
> incur an extra get_fence() on the rare path that we need to perform
> detiling through a pagefault (i.e. texture transfers).

Surely you could just update this to do that for the hardware that
requires it.  With a comment so someone doesn't delete it later :)

> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> ---
>  drivers/gpu/drm/i915/i915_gem.c |    4 ++++
>  1 files changed, 4 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 6ca026d..2d16a23 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -3355,6 +3355,10 @@ int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,
>  		if (ret)
>  			return ret;
>  
> +		ret = i915_gem_object_put_fence(obj);
> +		if (ret)
> +			return ret;
> +
>  		ret = i915_gem_gtt_bind_object(obj, cache_level);
>  		if (ret)
>  			return ret;
> -- 
> 1.7.4.1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Chris Wilson April 13, 2011, 4:59 p.m. UTC | #2
On Wed, 13 Apr 2011 09:36:08 -0700, Eric Anholt <eric@anholt.net> wrote:
> On Wed, 13 Apr 2011 13:25:40 +0100, Chris Wilson <chris@chris-wilson.co.uk> wrote:
> > This is vital to maintain our contract with the hw for not using fences
> > on snooped memory for older chipsets. It should have no impact
> > other than clearing the fence register (and updating the fence
> > bookkeeping) as any future IO access (page faults or pwrite/pread) will
> > go through the cached CPU domain for older chipsets. On SandyBridge, we
> > incur an extra get_fence() on the rare path that we need to perform
> > detiling through a pagefault (i.e. texture transfers).
> 
> Surely you could just update this to do that for the hardware that
> requires it.  With a comment so someone doesn't delete it later :)

The comment is surely lacking, yes. But the test here for the right
generations is just ugly since losing a CPU fence register is not that
big an issue -- the largest overhead will be in reinstating the vma, and
we need to do that anyway if we mix CPU / GTT reads through the pagefault
handler.
-Chris
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 6ca026d..2d16a23 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -3355,6 +3355,10 @@  int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,
 		if (ret)
 			return ret;
 
+		ret = i915_gem_object_put_fence(obj);
+		if (ret)
+			return ret;
+
 		ret = i915_gem_gtt_bind_object(obj, cache_level);
 		if (ret)
 			return ret;