[Intel-gfx] [PATCH] drm/i915: Flush GPU relocs harder for gen3

Joonas Lahtinen joonas.lahtinen at linux.intel.com
Fri Dec 7 14:08:57 UTC 2018


Quoting Chris Wilson (2018-12-07 15:40:37)
> Adding an extra MI_STORE_DWORD_IMM to the gpu relocation path for gen3
> was good, but still not good enough. To survive 24+ hours under test we
> needed to perform not one, not two but three extra store-dw. Doing so
> for each GPU relocation was a little unsightly and since we need to
> worry about userspace hitting the same issues, we should apply the dummy
> store-dw into the EMIT_FLUSH.
> 
> Fixes: 7dd4f6729f92 ("drm/i915: Async GPU relocation processing")
> References: 7fa28e146994 ("drm/i915: Write GPU relocs harder with gen3")
> Testcase: igt/gem_tiled_fence_blits # blb/pnv
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>

As we're not going to be adding read-only scratch pages for Gen2 (I
think it's a few generations too old to have it :P), this is:

Reviewed-by: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>

Regards, Joonas

> ---
>  drivers/gpu/drm/i915/i915_gem_execbuffer.c |  7 +------
>  drivers/gpu/drm/i915/intel_ringbuffer.c    | 15 ++++++++++++---
>  2 files changed, 13 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> index 10a4afb4f235..786d719e652d 100644
> --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> @@ -1268,7 +1268,7 @@ relocate_entry(struct i915_vma *vma,
>                 else if (gen >= 4)
>                         len = 4;
>                 else
> -                       len = 6;
> +                       len = 3;
>  
>                 batch = reloc_gpu(eb, vma, len);
>                 if (IS_ERR(batch))
> @@ -1309,11 +1309,6 @@ relocate_entry(struct i915_vma *vma,
>                         *batch++ = MI_STORE_DWORD_IMM | MI_MEM_VIRTUAL;
>                         *batch++ = addr;
>                         *batch++ = target_offset;
> -
> -                       /* And again for good measure (blb/pnv) */
> -                       *batch++ = MI_STORE_DWORD_IMM | MI_MEM_VIRTUAL;
> -                       *batch++ = addr;
> -                       *batch++ = target_offset;
>                 }
>  
>                 goto out;
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
> index 74a4d587c312..02f6a9b81083 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.c
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
> @@ -69,19 +69,28 @@ unsigned int intel_ring_update_space(struct intel_ring *ring)
>  static int
>  gen2_render_ring_flush(struct i915_request *rq, u32 mode)
>  {
> +       unsigned int num_store_dw;
>         u32 cmd, *cs;
>  
>         cmd = MI_FLUSH;
> -
> +       num_store_dw = 0;
>         if (mode & EMIT_INVALIDATE)
>                 cmd |= MI_READ_FLUSH;
> +       if (mode & EMIT_FLUSH)
> +               num_store_dw = 4;
>  
> -       cs = intel_ring_begin(rq, 2);
> +       cs = intel_ring_begin(rq, 2 + 3 * num_store_dw);
>         if (IS_ERR(cs))
>                 return PTR_ERR(cs);
>  
>         *cs++ = cmd;
> -       *cs++ = MI_NOOP;
> +       while (num_store_dw--) {
> +               *cs++ = MI_STORE_DWORD_IMM | MI_MEM_VIRTUAL;
> +               *cs++ = i915_scratch_offset(rq->i915);
> +               *cs++ = 0;
> +       }
> +       *cs++ = MI_FLUSH | MI_NO_WRITE_FLUSH;
> +
>         intel_ring_advance(rq, cs);
>  
>         return 0;
> -- 
> 2.20.0.rc2
> 


More information about the Intel-gfx mailing list