• Mika Kuoppala's avatar
    drm/i915: Fix timeout with missed interrupts in __wait_seqno · 47e9766d
    Mika Kuoppala authored
    Commit 094f9a54 ("drm/i915: Fix __wait_seqno to use true infinite
    timeouts") added support for __wait_seqno to detect missing interrupts and
    go around them by polling. As there is also timeout detection in
    __wait_seqno, the polling and timeout detection were done with the same
    timer.
    
    When there has been missed interrupts and polling is needed, the timer is
    set to trigger in (now + 1) jiffies in future, instead of the caller
    specified timeout.
    
    Now when io_schedule() returns, we calculate the jiffies left to timeout
    using the timer expiration value. As the current jiffies is now bound to be
    always equal or greater than the expiration value, the timeout_jiffies will
    become zero or negative and we return -ETIME to caller even tho the
    timeout was never reached.
    
    Fix this by decoupling timeout calculation from timer expiration.
    
    v2: Commit message with some sense in it (Chris Wilson)
    
    v3: add parenthesis on timeout_expire calculation
    
    v4: don't read jiffies without timeout (Chris Wilson)
    Signed-off-by: default avatarMika Kuoppala <mika.kuoppala@intel.com>
    Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    47e9766d
i915_gem.c 127 KB