Skip to content
  • Will Deacon's avatar
    kvmtool: virtio-net: fix VIRTIO_NET_F_MRG_RXBUF usage in rx thread · 3fea89a9
    Will Deacon authored
    
    
    When merging virtio-net buffers using the VIRTIO_NET_F_MRG_RXBUF feature,
    the first buffer added to the used ring should indicate the total number
    of buffers used to hold the packet. Unfortunately, kvmtool has a number
    of issues when constructing these merged buffers:
    
      - Commit 5131332e3f1a ("kvmtool: convert net backend to support
        bi-endianness") introduced a strange loop counter, which resulted in
        hdr->num_buffers being set redundantly the first time round
    
      - When adding the buffers to the ring, we actually add them one-by-one,
        allowing the guest to see the header before we've inserted the rest
        of the data buffers...
    
      - ... which is made worse because we non-atomically increment the
        num_buffers count in the header each time we insert a new data buffer
    
    Consequently, the guest quickly becomes confused in its net rx code and
    the whole thing grinds to a halt. This is easily exemplified by trying
    to boot a root filesystem over NFS, which seldom succeeds.
    
    This patch resolves the issues by allowing us to insert items into the
    used ring without updating the index. Once the full payload has been
    added and num_buffers corresponds to the total size, we *then* publish
    the buffers to the guest.
    
    Cc: Marc Zyngier <marc.zyngier@arm.com>
    Cc: Sasha Levin <sasha.levin@oracle.com>
    Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
    3fea89a9