• Peter Lieven's avatar
    block: fix initialization in bdrv_io_limits_enable() · 029d091e
    Peter Lieven authored
    
    
    bdrv_io_limits_enable() starts a new slice, but does not set io_base
    correctly for that slice.
    
    Here is how io_base is used:
    
        bytes_base  = bs->nr_bytes[is_write] - bs->io_base.bytes[is_write];
        bytes_res   = (unsigned) nb_sectors * BDRV_SECTOR_SIZE;
    
        if (bytes_base + bytes_res <= bytes_limit) {
            /* no wait */
        } else {
            /* operation needs to be throttled */
        }
    
    As a result, any I/O operations that are triggered between now and
    bs->slice_end are incorrectly limited.  If 10 MB of data has been
    written since the VM was started, QEMU thinks that 10 MB of data has
    been written in this slice. This leads to a I/O lockup in the guest.
    
    We fix this by delaying the start of a new slice to the next
    call of bdrv_exceed_io_limits().
    Signed-off-by: default avatarPeter Lieven <pl@kamp.de>
    Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    029d091e