• Michael S. Tsirkin's avatar
    ptr_ring: batch ring zeroing · fb9de970
    Michael S. Tsirkin authored
    A known weakness in ptr_ring design is that it does not handle well the
    situation when ring is almost full: as entries are consumed they are
    immediately used again by the producer, so consumer and producer are
    writing to a shared cache line.
    
    To fix this, add batching to consume calls: as entries are
    consumed do not write NULL into the ring until we get
    a multiple (in current implementation 2x) of cache lines
    away from the producer. At that point, write them all out.
    
    We do the write out in the reverse order to keep
    producer from sharing cache with consumer for as long
    as possible.
    
    Writeout also triggers when ring wraps around - there's
    no special reason to do this but it helps keep the code
    a bit simpler.
    
    What should we do if getting away from producer by 2 cache lines
    would mean we are keeping the ring moe than half empty?
    Maybe we should reduce the batching in this case,
    current patch simply reduces the batching.
    
    Notes:
    - it is no longer true that a call to consume guarantees
      that the following call to produce will succeed.
      No users seem to assume that.
    - batching can also in theory reduce the signalling rate:
      users that would previously send interrups to the producer
      to wake it up after consuming each entry would now only
      need to do this once in a batch.
      Doing this would be easy by returning a flag to the caller.
      No users seem to do signalling on consume yet so this was not
      implemented yet.
    Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    Reviewed-by: default avatarJesper Dangaard Brouer <brouer@redhat.com>
    Acked-by: default avatarJason Wang <jasowang@redhat.com>
    fb9de970
ptr_ring.h 12.6 KB