• Dave Gordon's avatar
    drm/i915: Make ring freespace calculation more robust · 4f54741e
    Dave Gordon authored
    The used space in a ring is given by the cyclic distance from the
    consumer (HEAD) to the producer (TAIL), i.e. ((tail-head) MOD size);
    conversely, the available space in a ring is the cyclic distance
    from the producer to the consumer, MINUS the amount reserved for a
    "gap" that is supposed to guarantee that the producer never catches
    up with or overruns the consumer. Note that some GEN h/w requires
    that TAIL never approach to within one cacheline of HEAD, so the gap
    is usually set to twice the cacheline size to ensure this.
    
    While the existing code gives the correct answer for correct inputs,
    if the producer HAS overrun into the reserved space, the result can
    be a value larger than the maximum valid value (size-reserved). We
    can improve this by reorganising the calculation, so that in the
    event of overrun the result will be negative rather than over-large.
    
    This means that the commonly-used test (available >= required)
    will then reject further writes into the ring after an overrun,
    giving some chance that we can recover from or at least diagnose
    the original problem; whereas allowing more writes would likely both
    confuse the h/w and destroy the evidence of what went wrong.
    Signed-off-by: default avatarDave Gordon <david.s.gordon@intel.com>
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    4f54741e
intel_ringbuffer.c 73 KB