dirty-bitmap: Change bdrv_[re]set_dirty_bitmap() to use bytes
Some of the callers were already scaling bytes to sectors; others can be easily converted to pass byte offsets, all in our shift towards a consistent byte interface everywhere. Making the change will also make it easier to write the hold-out callers to use byte rather than sectors for their iterations; it also makes it easier for a future dirty-bitmap patch to offload scaling over to the internal hbitmap. Although all callers happen to pass sector-aligned values, make the internal scaling robust to any sub-sector requests. Signed-off-by: Eric Blake <eblake@redhat.com> Reviewed-by: John Snow <jsnow@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Fam Zheng <famz@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
		
							parent
							
								
									3b5d4df0c6
								
							
						
					
					
						commit
						e0d7f73e63
					
				| 
						 | 
				
			
			@ -509,35 +509,41 @@ int64_t bdrv_dirty_iter_next(BdrvDirtyBitmapIter *iter)
 | 
			
		|||
 | 
			
		||||
/* Called within bdrv_dirty_bitmap_lock..unlock */
 | 
			
		||||
void bdrv_set_dirty_bitmap_locked(BdrvDirtyBitmap *bitmap,
 | 
			
		||||
                                  int64_t cur_sector, int64_t nr_sectors)
 | 
			
		||||
                                  int64_t offset, int64_t bytes)
 | 
			
		||||
{
 | 
			
		||||
    int64_t end_sector = DIV_ROUND_UP(offset + bytes, BDRV_SECTOR_SIZE);
 | 
			
		||||
 | 
			
		||||
    assert(bdrv_dirty_bitmap_enabled(bitmap));
 | 
			
		||||
    assert(!bdrv_dirty_bitmap_readonly(bitmap));
 | 
			
		||||
    hbitmap_set(bitmap->bitmap, cur_sector, nr_sectors);
 | 
			
		||||
    hbitmap_set(bitmap->bitmap, offset >> BDRV_SECTOR_BITS,
 | 
			
		||||
                end_sector - (offset >> BDRV_SECTOR_BITS));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void bdrv_set_dirty_bitmap(BdrvDirtyBitmap *bitmap,
 | 
			
		||||
                           int64_t cur_sector, int64_t nr_sectors)
 | 
			
		||||
                           int64_t offset, int64_t bytes)
 | 
			
		||||
{
 | 
			
		||||
    bdrv_dirty_bitmap_lock(bitmap);
 | 
			
		||||
    bdrv_set_dirty_bitmap_locked(bitmap, cur_sector, nr_sectors);
 | 
			
		||||
    bdrv_set_dirty_bitmap_locked(bitmap, offset, bytes);
 | 
			
		||||
    bdrv_dirty_bitmap_unlock(bitmap);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Called within bdrv_dirty_bitmap_lock..unlock */
 | 
			
		||||
void bdrv_reset_dirty_bitmap_locked(BdrvDirtyBitmap *bitmap,
 | 
			
		||||
                                    int64_t cur_sector, int64_t nr_sectors)
 | 
			
		||||
                                    int64_t offset, int64_t bytes)
 | 
			
		||||
{
 | 
			
		||||
    int64_t end_sector = DIV_ROUND_UP(offset + bytes, BDRV_SECTOR_SIZE);
 | 
			
		||||
 | 
			
		||||
    assert(bdrv_dirty_bitmap_enabled(bitmap));
 | 
			
		||||
    assert(!bdrv_dirty_bitmap_readonly(bitmap));
 | 
			
		||||
    hbitmap_reset(bitmap->bitmap, cur_sector, nr_sectors);
 | 
			
		||||
    hbitmap_reset(bitmap->bitmap, offset >> BDRV_SECTOR_BITS,
 | 
			
		||||
                  end_sector - (offset >> BDRV_SECTOR_BITS));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void bdrv_reset_dirty_bitmap(BdrvDirtyBitmap *bitmap,
 | 
			
		||||
                             int64_t cur_sector, int64_t nr_sectors)
 | 
			
		||||
                             int64_t offset, int64_t bytes)
 | 
			
		||||
{
 | 
			
		||||
    bdrv_dirty_bitmap_lock(bitmap);
 | 
			
		||||
    bdrv_reset_dirty_bitmap_locked(bitmap, cur_sector, nr_sectors);
 | 
			
		||||
    bdrv_reset_dirty_bitmap_locked(bitmap, offset, bytes);
 | 
			
		||||
    bdrv_dirty_bitmap_unlock(bitmap);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -141,8 +141,7 @@ static void mirror_write_complete(void *opaque, int ret)
 | 
			
		|||
    if (ret < 0) {
 | 
			
		||||
        BlockErrorAction action;
 | 
			
		||||
 | 
			
		||||
        bdrv_set_dirty_bitmap(s->dirty_bitmap, op->offset >> BDRV_SECTOR_BITS,
 | 
			
		||||
                              op->bytes >> BDRV_SECTOR_BITS);
 | 
			
		||||
        bdrv_set_dirty_bitmap(s->dirty_bitmap, op->offset, op->bytes);
 | 
			
		||||
        action = mirror_error_action(s, false, -ret);
 | 
			
		||||
        if (action == BLOCK_ERROR_ACTION_REPORT && s->ret >= 0) {
 | 
			
		||||
            s->ret = ret;
 | 
			
		||||
| 
						 | 
				
			
			@ -161,8 +160,7 @@ static void mirror_read_complete(void *opaque, int ret)
 | 
			
		|||
    if (ret < 0) {
 | 
			
		||||
        BlockErrorAction action;
 | 
			
		||||
 | 
			
		||||
        bdrv_set_dirty_bitmap(s->dirty_bitmap, op->offset >> BDRV_SECTOR_BITS,
 | 
			
		||||
                              op->bytes >> BDRV_SECTOR_BITS);
 | 
			
		||||
        bdrv_set_dirty_bitmap(s->dirty_bitmap, op->offset, op->bytes);
 | 
			
		||||
        action = mirror_error_action(s, true, -ret);
 | 
			
		||||
        if (action == BLOCK_ERROR_ACTION_REPORT && s->ret >= 0) {
 | 
			
		||||
            s->ret = ret;
 | 
			
		||||
| 
						 | 
				
			
			@ -382,8 +380,8 @@ static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s)
 | 
			
		|||
     * calling bdrv_get_block_status_above could yield - if some blocks are
 | 
			
		||||
     * marked dirty in this window, we need to know.
 | 
			
		||||
     */
 | 
			
		||||
    bdrv_reset_dirty_bitmap_locked(s->dirty_bitmap, offset >> BDRV_SECTOR_BITS,
 | 
			
		||||
                                   nb_chunks * sectors_per_chunk);
 | 
			
		||||
    bdrv_reset_dirty_bitmap_locked(s->dirty_bitmap, offset,
 | 
			
		||||
                                   nb_chunks * s->granularity);
 | 
			
		||||
    bdrv_dirty_bitmap_unlock(s->dirty_bitmap);
 | 
			
		||||
 | 
			
		||||
    bitmap_set(s->in_flight_bitmap, offset / s->granularity, nb_chunks);
 | 
			
		||||
| 
						 | 
				
			
			@ -625,7 +623,7 @@ static int coroutine_fn mirror_dirty_init(MirrorBlockJob *s)
 | 
			
		|||
 | 
			
		||||
    if (base == NULL && !bdrv_has_zero_init(target_bs)) {
 | 
			
		||||
        if (!bdrv_can_write_zeroes_with_unmap(target_bs)) {
 | 
			
		||||
            bdrv_set_dirty_bitmap(s->dirty_bitmap, 0, end);
 | 
			
		||||
            bdrv_set_dirty_bitmap(s->dirty_bitmap, 0, s->bdev_length);
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -681,7 +679,9 @@ static int coroutine_fn mirror_dirty_init(MirrorBlockJob *s)
 | 
			
		|||
        n = count >> BDRV_SECTOR_BITS;
 | 
			
		||||
        assert(n > 0);
 | 
			
		||||
        if (ret == 1) {
 | 
			
		||||
            bdrv_set_dirty_bitmap(s->dirty_bitmap, sector_num, n);
 | 
			
		||||
            bdrv_set_dirty_bitmap(s->dirty_bitmap,
 | 
			
		||||
                                  sector_num * BDRV_SECTOR_SIZE,
 | 
			
		||||
                                  n * BDRV_SECTOR_SIZE);
 | 
			
		||||
        }
 | 
			
		||||
        sector_num += n;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,9 +40,9 @@ const char *bdrv_dirty_bitmap_name(const BdrvDirtyBitmap *bitmap);
 | 
			
		|||
int64_t bdrv_dirty_bitmap_size(const BdrvDirtyBitmap *bitmap);
 | 
			
		||||
DirtyBitmapStatus bdrv_dirty_bitmap_status(BdrvDirtyBitmap *bitmap);
 | 
			
		||||
void bdrv_set_dirty_bitmap(BdrvDirtyBitmap *bitmap,
 | 
			
		||||
                           int64_t cur_sector, int64_t nr_sectors);
 | 
			
		||||
                           int64_t offset, int64_t bytes);
 | 
			
		||||
void bdrv_reset_dirty_bitmap(BdrvDirtyBitmap *bitmap,
 | 
			
		||||
                             int64_t cur_sector, int64_t nr_sectors);
 | 
			
		||||
                             int64_t offset, int64_t bytes);
 | 
			
		||||
BdrvDirtyBitmapIter *bdrv_dirty_meta_iter_new(BdrvDirtyBitmap *bitmap);
 | 
			
		||||
BdrvDirtyBitmapIter *bdrv_dirty_iter_new(BdrvDirtyBitmap *bitmap);
 | 
			
		||||
void bdrv_dirty_iter_free(BdrvDirtyBitmapIter *iter);
 | 
			
		||||
| 
						 | 
				
			
			@ -75,9 +75,9 @@ void bdrv_dirty_bitmap_unlock(BdrvDirtyBitmap *bitmap);
 | 
			
		|||
bool bdrv_get_dirty_locked(BlockDriverState *bs, BdrvDirtyBitmap *bitmap,
 | 
			
		||||
                           int64_t offset);
 | 
			
		||||
void bdrv_set_dirty_bitmap_locked(BdrvDirtyBitmap *bitmap,
 | 
			
		||||
                                  int64_t cur_sector, int64_t nr_sectors);
 | 
			
		||||
                                  int64_t offset, int64_t bytes);
 | 
			
		||||
void bdrv_reset_dirty_bitmap_locked(BdrvDirtyBitmap *bitmap,
 | 
			
		||||
                                    int64_t cur_sector, int64_t nr_sectors);
 | 
			
		||||
                                    int64_t offset, int64_t bytes);
 | 
			
		||||
int64_t bdrv_dirty_iter_next(BdrvDirtyBitmapIter *iter);
 | 
			
		||||
void bdrv_set_dirty_iter(BdrvDirtyBitmapIter *hbi, int64_t offset);
 | 
			
		||||
int64_t bdrv_get_dirty_count(BdrvDirtyBitmap *bitmap);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -334,7 +334,8 @@ static int mig_save_device_bulk(QEMUFile *f, BlkMigDevState *bmds)
 | 
			
		|||
    blk->aiocb = blk_aio_preadv(bb, cur_sector * BDRV_SECTOR_SIZE, &blk->qiov,
 | 
			
		||||
                                0, blk_mig_read_cb, blk);
 | 
			
		||||
 | 
			
		||||
    bdrv_reset_dirty_bitmap(bmds->dirty_bitmap, cur_sector, nr_sectors);
 | 
			
		||||
    bdrv_reset_dirty_bitmap(bmds->dirty_bitmap, cur_sector * BDRV_SECTOR_SIZE,
 | 
			
		||||
                            nr_sectors * BDRV_SECTOR_SIZE);
 | 
			
		||||
    aio_context_release(blk_get_aio_context(bmds->blk));
 | 
			
		||||
    qemu_mutex_unlock_iothread();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -542,7 +543,9 @@ static int mig_save_device_dirty(QEMUFile *f, BlkMigDevState *bmds,
 | 
			
		|||
            } else {
 | 
			
		||||
                nr_sectors = BDRV_SECTORS_PER_DIRTY_CHUNK;
 | 
			
		||||
            }
 | 
			
		||||
            bdrv_reset_dirty_bitmap_locked(bmds->dirty_bitmap, sector, nr_sectors);
 | 
			
		||||
            bdrv_reset_dirty_bitmap_locked(bmds->dirty_bitmap,
 | 
			
		||||
                                           sector * BDRV_SECTOR_SIZE,
 | 
			
		||||
                                           nr_sectors * BDRV_SECTOR_SIZE);
 | 
			
		||||
            bdrv_dirty_bitmap_unlock(bmds->dirty_bitmap);
 | 
			
		||||
 | 
			
		||||
            blk = g_new(BlkMigBlock, 1);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue