On Tue, Sep 02, 2014 at 02:32:40PM -0700, Jesse Barnes wrote: > +static int i915_fence_check(wait_queue_t *wait, unsigned mode, int flags, > + void *key) > +{ > + struct i915_fence *intel_fence = wait->private; > + struct intel_engine_cs *ring = intel_fence->ring; > + > + if (!i915_seqno_passed(ring->get_seqno(ring, false), > + intel_fence->seqno)) > + return 0; > + > + fence_signal_locked(&intel_fence->base); > + > + __remove_wait_queue(&ring->irq_queue, wait); > + fence_put(&intel_fence->base); > + ring->irq_put(ring); > + > + return 0; > +} > + > +static bool i915_fence_enable_signaling(struct fence *fence) > +{ > + struct i915_fence *intel_fence = to_intel_fence(fence); > + struct intel_engine_cs *ring = intel_fence->ring; > + struct drm_i915_private *dev_priv = ring->dev->dev_private; > + wait_queue_t *wait = &intel_fence->wait; > + > + /* queue fence wait queue on irq queue and get fence */ > + if (i915_seqno_passed(ring->get_seqno(ring, false), > + intel_fence->seqno) || > + i915_terminally_wedged(&dev_priv->gpu_error)) > + return false; > + > + if (!ring->irq_get(ring)) > + return false; > + > + wait->flags = 0; > + wait->private = intel_fence; > + wait->func = i915_fence_check; > + > + __add_wait_queue(&ring->irq_queue, wait); > + fence_get(fence); > + > + return true; > +} This looks like it implements poll(). You should recheck i915_request_complete() after setting up the irq waiter. Or does struct fence_ops handle that? -Chris -- Chris Wilson, Intel Open Source Technology Centre _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx