On Mon, May 05, 2014 at 09:07:32AM +0100, 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 <chris@xxxxxxxxxxxxxxxxxx> > --- > 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); This isn't exported so doesn't compile too well. I've undone this change for now. Otherwise both patches merged. -Daniel > + > + 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@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/intel-gfx -- Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx