• Dwight Engen's avatar
    vio: fix reuse of vio_dring slot · 03f0d176
    Dwight Engen authored
    commit d0aedcd4 upstream.
    
    vio_dring_avail() will allow use of every dring entry, but when the last
    entry is allocated then dr->prod == dr->cons which is indistinguishable from
    the ring empty condition. This causes the next allocation to reuse an entry.
    When this happens in sunvdc, the server side vds driver begins nack'ing the
    messages and ends up resetting the ldc channel. This problem does not effect
    sunvnet since it checks for < 2.
    
    The fix here is to just never allocate the very last dring slot so that full
    and empty are not the same condition. The request start path was changed to
    check for the ring being full a bit earlier, and to stop the blk_queue if
    there is no space left. The blk_queue will be restarted once the ring is
    only half full again. The number of ring entries was increased to 512 which
    matches the sunvnet and Solaris vdc drivers, and greatly reduces the
    frequency of hitting the ring full condition and the associated blk_queue
    stop/starting. The checks in sunvent were adjusted to account for
    vio_dring_avail() returning 1 less.
    
    Orabug: 19441666
    OraBZ: 14983
    Signed-off-by: default avatarDwight Engen <dwight.engen@oracle.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    Signed-off-by: default avatarLuis Henriques <luis.henriques@canonical.com>
    03f0d176
vio.h 9.38 KB