From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54425) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZcHBa-0006y2-T9 for qemu-devel@nongnu.org; Wed, 16 Sep 2015 14:12:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZcHBW-0000Rj-S4 for qemu-devel@nongnu.org; Wed, 16 Sep 2015 14:12:02 -0400 Received: from mx1.redhat.com ([209.132.183.28]:58430) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZcHBW-0000Ra-Ku for qemu-devel@nongnu.org; Wed, 16 Sep 2015 14:11:58 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 207E591DAA for ; Wed, 16 Sep 2015 18:11:58 +0000 (UTC) From: "Dr. David Alan Gilbert (git)" Date: Wed, 16 Sep 2015 19:11:53 +0100 Message-Id: <1442427114-5075-2-git-send-email-dgilbert@redhat.com> In-Reply-To: <1442427114-5075-1-git-send-email-dgilbert@redhat.com> References: <1442427114-5075-1-git-send-email-dgilbert@redhat.com> Subject: [Qemu-devel] [PATCH 1/2] Move dirty page search state into separate structure List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: amit.shah@redhat.com, quintela@redhat.com From: "Dr. David Alan Gilbert" Pull the sarch state for one iteration of the dirty page search into a structure. Signed-off-by: Dr. David Alan Gilbert --- migration/ram.c | 54 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/migration/ram.c b/migration/ram.c index 7df9157..1fadf52 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -227,6 +227,17 @@ static uint64_t migration_dirty_pages; static uint32_t last_version; static bool ram_bulk_stage; +/* used by the search for pages to send */ +struct PageSearchStatus { + /* Current block being searched */ + RAMBlock *block; + /* Current offset to search from */ + ram_addr_t offset; + /* Set once we wrap around */ + bool complete_round; +}; +typdef struct PageSearchStatus PageSearchStatus; + struct CompressParam { bool start; bool done; @@ -531,7 +542,6 @@ static void migration_bitmap_sync_range(ram_addr_t start, ram_addr_t length) cpu_physical_memory_sync_dirty_bitmap(bitmap, start, length); } - /* Fix me: there are too many global variables used in migration process. */ static int64_t start_time; static int64_t bytes_xfer_prev; @@ -923,26 +933,29 @@ static int ram_save_compressed_page(QEMUFile *f, RAMBlock *block, static int ram_find_and_save_block(QEMUFile *f, bool last_stage, uint64_t *bytes_transferred) { - RAMBlock *block = last_seen_block; - ram_addr_t offset = last_offset; - bool complete_round = false; + PageSearchStatus pss; int pages = 0; - if (!block) - block = QLIST_FIRST_RCU(&ram_list.blocks); + pss.block = last_seen_block; + pss.offset = last_offset; + pss.complete_round = false; + + if (!pss.block) + pss.block = QLIST_FIRST_RCU(&ram_list.blocks); while (true) { - offset = migration_bitmap_find_and_reset_dirty(block, offset); - if (complete_round && block == last_seen_block && - offset >= last_offset) { + 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 (offset >= block->used_length) { - offset = 0; - block = QLIST_NEXT_RCU(block, next); - if (!block) { - block = QLIST_FIRST_RCU(&ram_list.blocks); - complete_round = true; + 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 @@ -954,23 +967,24 @@ static int ram_find_and_save_block(QEMUFile *f, bool last_stage, } } else { if (compression_switch && migrate_use_compression()) { - pages = ram_save_compressed_page(f, block, offset, last_stage, + pages = ram_save_compressed_page(f, pss.block, pss.offset, + last_stage, bytes_transferred); } else { - pages = ram_save_page(f, block, offset, last_stage, + pages = ram_save_page(f, pss.block, pss.offset, last_stage, bytes_transferred); } /* if page is unmodified, continue to the next */ if (pages > 0) { - last_sent_block = block; + last_sent_block = pss.block; break; } } } - last_seen_block = block; - last_offset = offset; + last_seen_block = pss.block; + last_offset = pss.offset; return pages; } -- 2.4.3