Skip to content
  • Stefan Hajnoczi's avatar
    4b7f91ed
    virtio: zero vq->inuse in virtio_reset() · 4b7f91ed
    Stefan Hajnoczi authored
    
    
    vq->inuse must be zeroed upon device reset like most other virtqueue
    fields.
    
    In theory, virtio_reset() just needs assert(vq->inuse == 0) since
    devices must clean up in-flight requests during reset (requests cannot
    not be leaked!).
    
    In practice, it is difficult to achieve vq->inuse == 0 across reset
    because balloon, blk, 9p, etc implement various different strategies for
    cleaning up requests.  Most devices call g_free(elem) directly without
    telling virtio.c that the VirtQueueElement is cleaned up.  Therefore
    vq->inuse is not decremented during reset.
    
    This patch zeroes vq->inuse and trusts that devices are not leaking
    VirtQueueElements across reset.
    
    I will send a follow-up series that refactors request life-cycle across
    all devices and converts vq->inuse = 0 into assert(vq->inuse == 0) but
    this more invasive approach is not appropriate for stable trees.
    
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    Cc: qemu-stable <qemu-stable@nongnu.org>
    Reviewed-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    Reviewed-by: default avatarLadi Prosek <lprosek@redhat.com>
    4b7f91ed
    virtio: zero vq->inuse in virtio_reset()
    Stefan Hajnoczi authored
    
    
    vq->inuse must be zeroed upon device reset like most other virtqueue
    fields.
    
    In theory, virtio_reset() just needs assert(vq->inuse == 0) since
    devices must clean up in-flight requests during reset (requests cannot
    not be leaked!).
    
    In practice, it is difficult to achieve vq->inuse == 0 across reset
    because balloon, blk, 9p, etc implement various different strategies for
    cleaning up requests.  Most devices call g_free(elem) directly without
    telling virtio.c that the VirtQueueElement is cleaned up.  Therefore
    vq->inuse is not decremented during reset.
    
    This patch zeroes vq->inuse and trusts that devices are not leaking
    VirtQueueElements across reset.
    
    I will send a follow-up series that refactors request life-cycle across
    all devices and converts vq->inuse = 0 into assert(vq->inuse == 0) but
    this more invasive approach is not appropriate for stable trees.
    
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    Cc: qemu-stable <qemu-stable@nongnu.org>
    Reviewed-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    Reviewed-by: default avatarLadi Prosek <lprosek@redhat.com>
Loading