On 11/12/2014 15:17, Vladimir Sementsov-Ogievskiy wrote: > - qemu_mutex_lock_iothread(); > + bdrv_reset_dirty_bitmap(bs, bmds->dirty_bitmap, cur_sector, nr_sectors); > + > blk->aiocb = bdrv_aio_readv(bs, cur_sector, &blk->qiov, > nr_sectors, blk_mig_read_cb, blk); > > - bdrv_reset_dirty_bitmap(bs, bmds->dirty_bitmap, cur_sector, nr_sectors); > - qemu_mutex_unlock_iothread(); > -
bdrv_aio_readv is not thread safe, so it needs the iothread lock. bdrv_reset_dirty_bitmap is also not thread safe, because bmds->dirty_bitmap is accessed concurrently by bdrv_reset_dirty (discard) and bdrv_set_dirty (write). So it needs the iothread lock too. Moving bdrv_reset_dirty_bitmap before the read is a good idea. Paolo