Revision e4654d2d block-migration.c
b/block-migration.c | ||
---|---|---|
58 | 58 |
/* Protected by block migration lock. */ |
59 | 59 |
unsigned long *aio_bitmap; |
60 | 60 |
int64_t completed_sectors; |
61 |
BdrvDirtyBitmap *dirty_bitmap; |
|
61 | 62 |
} BlkMigDevState; |
62 | 63 |
|
63 | 64 |
typedef struct BlkMigBlock { |
... | ... | |
309 | 310 |
|
310 | 311 |
/* Called with iothread lock taken. */ |
311 | 312 |
|
312 |
static void set_dirty_tracking(int enable)
|
|
313 |
static void set_dirty_tracking(void)
|
|
313 | 314 |
{ |
314 | 315 |
BlkMigDevState *bmds; |
315 | 316 |
|
316 | 317 |
QSIMPLEQ_FOREACH(bmds, &block_mig_state.bmds_list, entry) { |
317 |
bdrv_set_dirty_tracking(bmds->bs, enable ? BLOCK_SIZE : 0); |
|
318 |
bmds->dirty_bitmap = bdrv_create_dirty_bitmap(bmds->bs, BLOCK_SIZE); |
|
319 |
} |
|
320 |
} |
|
321 |
|
|
322 |
static void unset_dirty_tracking(void) |
|
323 |
{ |
|
324 |
BlkMigDevState *bmds; |
|
325 |
|
|
326 |
QSIMPLEQ_FOREACH(bmds, &block_mig_state.bmds_list, entry) { |
|
327 |
bdrv_release_dirty_bitmap(bmds->bs, bmds->dirty_bitmap); |
|
318 | 328 |
} |
319 | 329 |
} |
320 | 330 |
|
... | ... | |
432 | 442 |
} else { |
433 | 443 |
blk_mig_unlock(); |
434 | 444 |
} |
435 |
if (bdrv_get_dirty(bmds->bs, sector)) { |
|
445 |
if (bdrv_get_dirty(bmds->bs, bmds->dirty_bitmap, sector)) {
|
|
436 | 446 |
|
437 | 447 |
if (total_sectors - sector < BDRV_SECTORS_PER_DIRTY_CHUNK) { |
438 | 448 |
nr_sectors = total_sectors - sector; |
... | ... | |
554 | 564 |
int64_t dirty = 0; |
555 | 565 |
|
556 | 566 |
QSIMPLEQ_FOREACH(bmds, &block_mig_state.bmds_list, entry) { |
557 |
dirty += bdrv_get_dirty_count(bmds->bs); |
|
567 |
dirty += bdrv_get_dirty_count(bmds->bs, bmds->dirty_bitmap);
|
|
558 | 568 |
} |
559 | 569 |
|
560 | 570 |
return dirty << BDRV_SECTOR_BITS; |
... | ... | |
569 | 579 |
|
570 | 580 |
bdrv_drain_all(); |
571 | 581 |
|
572 |
set_dirty_tracking(0);
|
|
582 |
unset_dirty_tracking();
|
|
573 | 583 |
|
574 | 584 |
blk_mig_lock(); |
575 | 585 |
while ((bmds = QSIMPLEQ_FIRST(&block_mig_state.bmds_list)) != NULL) { |
... | ... | |
604 | 614 |
init_blk_migration(f); |
605 | 615 |
|
606 | 616 |
/* start track dirty blocks */ |
607 |
set_dirty_tracking(1);
|
|
617 |
set_dirty_tracking(); |
|
608 | 618 |
qemu_mutex_unlock_iothread(); |
609 | 619 |
|
610 | 620 |
ret = flush_blks(f); |
Also available in: Unified diff