Skip to content

Commit

Permalink
ram_find_and_save_block: Split out the finding
Browse files Browse the repository at this point in the history
Split out the finding of the dirty page and all the wrap detection
into a separate function since it was getting a bit hairy.

Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Message-Id: <1443018431-11170-3-git-send-email-dgilbert@redhat.com>
Reviewed-by: Amit Shah <amit.shah@redhat.com>

[Fix comment -- Amit]
Signed-off-by: Amit Shah <amit.shah@redhat.com>
  • Loading branch information
dagrh authored and Amit Shah committed Sep 29, 2015
1 parent b8fb8cb commit b9e6092
Showing 1 changed file with 59 additions and 25 deletions.
84 changes: 59 additions & 25 deletions migration/ram.c
Expand Up @@ -917,6 +917,59 @@ static int ram_save_compressed_page(QEMUFile *f, RAMBlock *block,
return pages;
}

/*
* Find the next dirty page and update any state associated with
* the search process.
*
* Returns: True if a page is found
*
* @f: Current migration stream.
* @pss: Data about the state of the current dirty page scan.
* @*again: Set to false if the search has scanned the whole of RAM
*/
static bool find_dirty_block(QEMUFile *f, PageSearchStatus *pss,
bool *again)
{
pss->offset = migration_bitmap_find_and_reset_dirty(pss->block,
pss->offset);
if (pss->complete_round && pss->block == last_seen_block &&
pss->offset >= last_offset) {
/*
* We've been once around the RAM and haven't found anything.
* Give up.
*/
*again = false;
return false;
}
if (pss->offset >= pss->block->used_length) {
/* Didn't find anything in this RAM Block */
pss->offset = 0;
pss->block = QLIST_NEXT_RCU(pss->block, next);
if (!pss->block) {
/* Hit the end of the list */
pss->block = QLIST_FIRST_RCU(&ram_list.blocks);
/* Flag that we've looped */
pss->complete_round = true;
ram_bulk_stage = false;
if (migrate_use_xbzrle()) {
/* If xbzrle is on, stop using the data compression at this
* point. In theory, xbzrle can do better than compression.
*/
flush_compressed_data(f);
compression_switch = false;
}
}
/* Didn't find anything this time, but try again on the new block */
*again = true;
return false;
} else {
/* Can go around again, but... */
*again = true;
/* We've found something so probably don't need to */
return true;
}
}

/**
* ram_find_and_save_block: Finds a dirty page and sends it to f
*
Expand All @@ -935,6 +988,7 @@ static int ram_find_and_save_block(QEMUFile *f, bool last_stage,
{
PageSearchStatus pss;
int pages = 0;
bool again, found;

pss.block = last_seen_block;
pss.offset = last_offset;
Expand All @@ -944,29 +998,10 @@ static int ram_find_and_save_block(QEMUFile *f, bool last_stage,
pss.block = QLIST_FIRST_RCU(&ram_list.blocks);
}

while (true) {
pss.offset = migration_bitmap_find_and_reset_dirty(pss.block,
pss.offset);
if (pss.complete_round && pss.block == last_seen_block &&
pss.offset >= last_offset) {
break;
}
if (pss.offset >= pss.block->used_length) {
pss.offset = 0;
pss.block = QLIST_NEXT_RCU(pss.block, next);
if (!pss.block) {
pss.block = QLIST_FIRST_RCU(&ram_list.blocks);
pss.complete_round = true;
ram_bulk_stage = false;
if (migrate_use_xbzrle()) {
/* If xbzrle is on, stop using the data compression at this
* point. In theory, xbzrle can do better than compression.
*/
flush_compressed_data(f);
compression_switch = false;
}
}
} else {
do {
found = find_dirty_block(f, &pss, &again);

if (found) {
if (compression_switch && migrate_use_compression()) {
pages = ram_save_compressed_page(f, pss.block, pss.offset,
last_stage,
Expand All @@ -979,10 +1014,9 @@ static int ram_find_and_save_block(QEMUFile *f, bool last_stage,
/* if page is unmodified, continue to the next */
if (pages > 0) {
last_sent_block = pss.block;
break;
}
}
}
} while (!pages && again);

last_seen_block = pss.block;
last_offset = pss.offset;
Expand Down

0 comments on commit b9e6092

Please sign in to comment.