[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 04/12] arch_init: introduce ram_page_save()
From: |
Lei Li |
Subject: |
[Qemu-devel] [PATCH 04/12] arch_init: introduce ram_page_save() |
Date: |
Fri, 26 Jul 2013 04:18:11 +0800 |
Signed-off-by: Lei Li <address@hidden>
---
arch_init.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 58 insertions(+), 0 deletions(-)
diff --git a/arch_init.c b/arch_init.c
index a8b91ee..a418071 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -699,6 +699,64 @@ static uint64_t ram_save_pending(QEMUFile *f, void
*opaque, uint64_t max_size)
return remaining_size;
}
+/* This is the last block from where we have sent data for local migration */
+static RAMBlock *last_block_local;
+static ram_addr_t last_offset_local;
+
+static int ram_page_save(QEMUFile *f)
+{
+ RAMBlock *block = last_block_local;
+ ram_addr_t offset = last_offset_local;
+ MemoryRegion *mr = block->mr;
+ int bytes_sent = 0;
+
+ if (!block) {
+ block = QTAILQ_FIRST(&ram_list.blocks);
+ }
+
+ do {
+ mr = block->mr;
+ uint8_t *p;
+ int cont = (block == last_block_local) ? RAM_SAVE_FLAG_CONTINUE : 0;
+
+ p = memory_region_get_ram_ptr(mr) + offset;
+
+ if (is_zero_page(p)) {
+ qemu_put_be64(f, offset | cont | RAM_SAVE_FLAG_COMPRESS);
+ if (!cont) {
+ qemu_put_byte(f, strlen(block->idstr));
+ qemu_put_buffer(f, (uint8_t *)block->idstr,
+ strlen(block->idstr));
+ }
+ qemu_put_byte(f, *p);
+ bytes_sent = 1;
+ } else {
+ qemu_put_be64(f, offset | cont | RAM_SAVE_FLAG_PAGE);
+ if (!cont) {
+ qemu_put_byte(f, strlen(block->idstr));
+ qemu_put_buffer(f, (uint8_t *)block->idstr,
+ strlen(block->idstr));
+ }
+ qemu_put_buffer(f, p, TARGET_PAGE_SIZE);
+ bytes_sent = TARGET_PAGE_SIZE;
+ }
+
+ offset += TARGET_PAGE_SIZE;
+ if (offset >= block->length) {
+ offset = 0;
+ block = QTAILQ_NEXT(block, next);
+ if (!block) {
+ block = QTAILQ_FIRST(&ram_list.blocks);
+ }
+ }
+ } while (block != last_block_local || offset != last_offset_local);
+
+ last_block_local = block;
+ last_offset_local = offset;
+
+ return bytes_sent;
+}
+
static int load_xbzrle(QEMUFile *f, ram_addr_t addr, void *host)
{
int ret, rc = 0;
--
1.7.7.6
- [Qemu-devel] [PATCH 0/12 RFC v2] Localhost migration, Lei Li, 2013/07/25
- [Qemu-devel] [PATCH 04/12] arch_init: introduce ram_page_save(),
Lei Li <=
- [Qemu-devel] [PATCH 03/12] rename is_active to is_block_active, Lei Li, 2013/07/25
- [Qemu-devel] [PATCH 02/12] savevm: export qemu_save_device_state(), Lei Li, 2013/07/25
- [Qemu-devel] [PATCH 05/12] arch_init: introduce ram_save_local(), Lei Li, 2013/07/25
- [Qemu-devel] [PATCH 06/12] arch_init: add save_local_setup to savevm_ram_handlers, Lei Li, 2013/07/25
- [Qemu-devel] [PATCH 07/12] savevm: introduce qemu_savevm_local(), Lei Li, 2013/07/25
- [Qemu-devel] [PATCH 08/12] savevm: adjust is_ram check in register_savevm_live(), Lei Li, 2013/07/25
- [Qemu-devel] [PATCH 01/12] migration: export MIG_STATE_xxx flags, Lei Li, 2013/07/25
- [Qemu-devel] [PATCH 12/12] hmp: add hmp_localhost_migration interface, Lei Li, 2013/07/25
- [Qemu-devel] [PATCH 10/12] migration-local: implementation of incoming part, Lei Li, 2013/07/25
- [Qemu-devel] [PATCH 09/12] migration-local: implementation of outgoing part, Lei Li, 2013/07/25