On Mon, May 05, 2014 at 01:07:32AM -0700, Chris Wilson wrote:
> A few improvements to the fallback method for waiting upon ring space:
> 
> 1. Fix the start/end wait tracepoints to always be paired.
> 2. Increase responsiveness of checking
> 3. Mark the process as waiting upon io
> 4. Check for signal interruptions
> 
> Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>

These seem like reasonable improvements.
Reviewed-by: Brad Volkin <bradley.d.vol...@intel.com>

> ---
>  drivers/gpu/drm/i915/intel_ringbuffer.c | 24 +++++++++++++++++-------
>  1 file changed, 17 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c 
> b/drivers/gpu/drm/i915/intel_ringbuffer.c
> index e0c7bf27eafd..d6b7b884adf9 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.c
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
> @@ -1546,7 +1546,6 @@ static int ring_wait_for_space(struct intel_ring_buffer 
> *ring, int n)
>       /* force the tail write in case we have been skipping them */
>       __intel_ring_advance(ring);
>  
> -     trace_i915_ring_wait_begin(ring);
>       /* With GEM the hangcheck timer should kick us out of the loop,
>        * leaving it early runs the risk of corrupting GEM state (due
>        * to running on almost untested codepaths). But on resume
> @@ -1554,12 +1553,13 @@ static int ring_wait_for_space(struct 
> intel_ring_buffer *ring, int n)
>        * case by choosing an insanely large timeout. */
>       end = jiffies + 60 * HZ;
>  
> +     trace_i915_ring_wait_begin(ring);
>       do {
>               ring->head = I915_READ_HEAD(ring);
>               ring->space = ring_space(ring);
>               if (ring->space >= n) {
> -                     trace_i915_ring_wait_end(ring);
> -                     return 0;
> +                     ret = 0;
> +                     break;
>               }
>  
>               if (!drm_core_check_feature(dev, DRIVER_MODESET) &&
> @@ -1569,15 +1569,25 @@ static int ring_wait_for_space(struct 
> intel_ring_buffer *ring, int n)
>                               master_priv->sarea_priv->perf_boxes |= 
> I915_BOX_WAIT;
>               }
>  
> -             msleep(1);
> +             io_schedule_timeout(1);
> +
> +             if (dev_priv->mm.interruptible && signal_pending(current)) {
> +                     ret = -ERESTARTSYS;
> +                     break;
> +             }
>  
>               ret = i915_gem_check_wedge(&dev_priv->gpu_error,
>                                          dev_priv->mm.interruptible);
>               if (ret)
> -                     return ret;
> -     } while (!time_after(jiffies, end));
> +                     break;
> +
> +             if (time_after(jiffies, end)) {
> +                     ret = -EBUSY;
> +                     break;
> +             }
> +     } while (1);
>       trace_i915_ring_wait_end(ring);
> -     return -EBUSY;
> +     return ret;
>  }
>  
>  static int intel_wrap_ring_buffer(struct intel_ring_buffer *ring)
> -- 
> 2.0.0.rc0
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to