[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [v3 07/13] migraion: Rewrite the function ram_save_page()
From: |
Liang Li |
Subject: |
[Qemu-devel] [v3 07/13] migraion: Rewrite the function ram_save_page() |
Date: |
Fri, 12 Dec 2014 09:29:00 +0800 |
We rewrite this function to reuse the code in it
Signed-off-by: Liang Li <address@hidden>
Signed-off-by: Yang Zhang <address@hidden>
---
arch_init.c | 107 ++++++++++++++++++++++++++++++++++--------------------------
1 file changed, 61 insertions(+), 46 deletions(-)
diff --git a/arch_init.c b/arch_init.c
index 71cc756..0a575ed 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -596,6 +596,63 @@ static void migration_bitmap_sync_range(ram_addr_t start,
ram_addr_t length)
}
}
+static int save_zero_and_xbzrle_page(QEMUFile *f, RAMBlock* block,
+ ram_addr_t offset, bool last_stage, bool *send_async)
+{
+ int bytes_sent;
+ int cont;
+ ram_addr_t current_addr;
+ MemoryRegion *mr = block->mr;
+ uint8_t *p;
+ int ret;
+
+ cont = (block == last_sent_block) ? RAM_SAVE_FLAG_CONTINUE : 0;
+
+ p = memory_region_get_ram_ptr(mr) + offset;
+
+ /* In doubt sent page as normal */
+ bytes_sent = -1;
+ ret = ram_control_save_page(f, block->offset,
+ offset, TARGET_PAGE_SIZE, &bytes_sent);
+
+ XBZRLE_cache_lock();
+
+ current_addr = block->offset + offset;
+ if (ret != RAM_SAVE_CONTROL_NOT_SUPP) {
+ if (ret != RAM_SAVE_CONTROL_DELAYED) {
+ if (bytes_sent > 0) {
+ acct_info.norm_pages++;
+ } else if (bytes_sent == 0) {
+ acct_info.dup_pages++;
+ }
+ }
+ } else if (is_zero_range(p, TARGET_PAGE_SIZE)) {
+ acct_info.dup_pages++;
+ bytes_sent = save_block_hdr(f, block, offset, cont,
+ RAM_SAVE_FLAG_COMPRESS);
+ qemu_put_byte(f, 0);
+ bytes_sent++;
+ /* Must let xbzrle know, otherwise a previous (now 0'd) cached
+ * page would be stale
+ */
+ xbzrle_cache_zero_page(current_addr);
+ } else if (!ram_bulk_stage && migrate_use_xbzrle()) {
+ bytes_sent = save_xbzrle_page(f, &p, current_addr, block,
+ offset, cont, last_stage);
+ if (!last_stage) {
+ /* Can't send this cached data async, since the cache page
+ * might get updated before it gets to the wire
+ */
+ if (send_async != NULL) {
+ *send_async = false;
+ }
+ }
+ }
+
+ XBZRLE_cache_unlock();
+
+ return bytes_sent;
+}
/* Needs iothread lock! */
/* Fix me: there are too many global variables used in migration process. */
@@ -691,55 +748,15 @@ static int ram_save_page(QEMUFile *f, RAMBlock* block,
ram_addr_t offset,
{
int bytes_sent;
int cont;
- ram_addr_t current_addr;
MemoryRegion *mr = block->mr;
uint8_t *p;
- int ret;
bool send_async = true;
- cont = (block == last_sent_block) ? RAM_SAVE_FLAG_CONTINUE : 0;
-
- p = memory_region_get_ram_ptr(mr) + offset;
-
- /* In doubt sent page as normal */
- bytes_sent = -1;
- ret = ram_control_save_page(f, block->offset,
- offset, TARGET_PAGE_SIZE, &bytes_sent);
-
- XBZRLE_cache_lock();
-
- current_addr = block->offset + offset;
- if (ret != RAM_SAVE_CONTROL_NOT_SUPP) {
- if (ret != RAM_SAVE_CONTROL_DELAYED) {
- if (bytes_sent > 0) {
- acct_info.norm_pages++;
- } else if (bytes_sent == 0) {
- acct_info.dup_pages++;
- }
- }
- } else if (is_zero_range(p, TARGET_PAGE_SIZE)) {
- acct_info.dup_pages++;
- bytes_sent = save_block_hdr(f, block, offset, cont,
- RAM_SAVE_FLAG_COMPRESS);
- qemu_put_byte(f, 0);
- bytes_sent++;
- /* Must let xbzrle know, otherwise a previous (now 0'd) cached
- * page would be stale
- */
- xbzrle_cache_zero_page(current_addr);
- } else if (!ram_bulk_stage && migrate_use_xbzrle()) {
- bytes_sent = save_xbzrle_page(f, &p, current_addr, block,
- offset, cont, last_stage);
- if (!last_stage) {
- /* Can't send this cached data async, since the cache page
- * might get updated before it gets to the wire
- */
- send_async = false;
- }
- }
-
- /* XBZRLE overflow or normal page */
+ bytes_sent = save_zero_and_xbzrle_page(f, block, offset,
+ last_stage, &send_async);
if (bytes_sent == -1) {
+ cont = (block == last_sent_block) ? RAM_SAVE_FLAG_CONTINUE : 0;
+ p = memory_region_get_ram_ptr(mr) + offset;
bytes_sent = save_block_hdr(f, block, offset, cont,
RAM_SAVE_FLAG_PAGE);
if (send_async) {
qemu_put_buffer_async(f, p, TARGET_PAGE_SIZE);
@@ -750,8 +767,6 @@ static int ram_save_page(QEMUFile *f, RAMBlock* block,
ram_addr_t offset,
acct_info.norm_pages++;
}
- XBZRLE_cache_unlock();
-
return bytes_sent;
}
--
1.8.3.1
- [Qemu-devel] [PATCH v3 0/13] migration: Add a new feature to do live migration, Liang Li, 2014/12/11
- [Qemu-devel] [v3 01/13] docs: Add a doc about multiple thread compression, Liang Li, 2014/12/11
- [Qemu-devel] [v3 04/13] qemu-file: Add tow function will be used in migration, Liang Li, 2014/12/11
- [Qemu-devel] [v3 05/13] arch_init: alloc and free data struct in multi-thread compression, Liang Li, 2014/12/11
- [Qemu-devel] [v3 02/13] migration: Add the framework of multi-thread compression, Liang Li, 2014/12/11
- [Qemu-devel] [v3 06/13] arch_init: Add data struct used by decompression, Liang Li, 2014/12/11
- [Qemu-devel] [v3 03/13] migration: Add the framework of muti-thread decompression, Liang Li, 2014/12/11
- [Qemu-devel] [v3 07/13] migraion: Rewrite the function ram_save_page(),
Liang Li <=
- [Qemu-devel] [v3 08/13] migration: Add the core code of multi-thread compresion, Liang Li, 2014/12/11
- [Qemu-devel] [v3 09/13] migration: Make compression co-work with xbzrle, Liang Li, 2014/12/11
- [Qemu-devel] [v3 10/13] migration: Add the core code of multi-thread decompression, Liang Li, 2014/12/11
- [Qemu-devel] [v3 11/13] migration: Add interface to control compression, Liang Li, 2014/12/11
- [Qemu-devel] [v3 12/13] migration: Add command to set migration parameter, Liang Li, 2014/12/11
- [Qemu-devel] [v3 13/13] migration: Add command to query migration parameter, Liang Li, 2014/12/11
- Re: [Qemu-devel] [PATCH v3 0/13] migration: Add a new feature to do live migration, Li, Liang Z, 2014/12/24