Commit 62155e2b authored by Marcelo Tosatti's avatar Marcelo Tosatti Committed by Kevin Wolf
Browse files

block migration: do not submit multiple AIOs for same sector (v2)



An old version of this patch was applied to master, so this contains the
differences between v1 and v2.

Signed-off-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent 9063f814
Loading
Loading
Loading
Loading
+5 −9
Original line number Diff line number Diff line
@@ -146,8 +146,7 @@ static int bmds_aio_inflight(BlkMigDevState *bmds, int64_t sector)
{
    int64_t chunk = sector / (int64_t)BDRV_SECTORS_PER_DIRTY_CHUNK;

    if (bmds->aio_bitmap &&
        (sector << BDRV_SECTOR_BITS) < bdrv_getlength(bmds->bs)) {
    if ((sector << BDRV_SECTOR_BITS) < bdrv_getlength(bmds->bs)) {
        return !!(bmds->aio_bitmap[chunk / (sizeof(unsigned long) * 8)] &
            (1UL << (chunk % (sizeof(unsigned long) * 8))));
    } else {
@@ -169,14 +168,10 @@ static void bmds_set_aio_inflight(BlkMigDevState *bmds, int64_t sector_num,
        bit = start % (sizeof(unsigned long) * 8);
        val = bmds->aio_bitmap[idx];
        if (set) {
            if (!(val & (1UL << bit))) {
            val |= 1UL << bit;
            }
        } else {
            if (val & (1UL << bit)) {
            val &= ~(1UL << bit);
        }
        }
        bmds->aio_bitmap[idx] = val;
    }
}
@@ -385,8 +380,9 @@ static int mig_save_device_dirty(Monitor *mon, QEMUFile *f,
    int nr_sectors;

    for (sector = bmds->cur_dirty; sector < bmds->total_sectors;) {
        if (bmds_aio_inflight(bmds, sector))
        if (bmds_aio_inflight(bmds, sector)) {
            qemu_aio_flush();
        }
        if (bdrv_get_dirty(bmds->bs, sector)) {

            if (total_sectors - sector < BDRV_SECTORS_PER_DIRTY_CHUNK) {