• John Harrison's avatar
    drm/i915: Fix for ringbuf space wait in LRC mode · dbe4646d
    John Harrison authored
    The legacy and LRC code paths have an almost identical procedure for waiting for
    space in the ring buffer. They both search for a request in the free list that
    will advance the tail to a point where sufficient space is available. They then
    wait for that request, retire it and recalculate the free space value.
    
    Unfortunately, a bug in the LRC side meant that the resulting free space might
    not be as large as expected and indeed, might not be sufficient. This is because
    it was testing against the value of request->tail not request->postfix. Whereas,
    when a request is retired, ringbuf->tail is updated to req->postfix not
    req->tail.
    
    Another significant difference between the two is that the LRC one did not trust
    the wait for request to work! It redid the is there enough space available test
    and would fail the call if insufficient. Whereas, the legacy version just said
    'return 0' - it assumed the preceeding code works. This difference meant that
    the LRC version still worked even with the bug - it just fell back to the
    polling wait path.
    
    For: VIZ-5115
    Signed-off-by: default avatarJohn Harrison <John.C.Harrison@Intel.com>
    Reviewed-by: default avatarThomas Daniel <thomas.daniel@intel.com>
    Reviewed-by: default avatarTomas Elf <tomas.elf@intel.com>
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    dbe4646d
intel_ringbuffer.c 77.5 KB