qemu: fix physical memory migration
PATCH 1/1 qemu: fix physical memory migration
Hi,
Attaching patch that:
1. Fix physical memory live migration.
- Stop dirty memory tracking after completion of memory transfer.
- In stage 3, updating dirty memory bits before collecting
remaining dirty blocks
in order to prevent missing dirty blokes in the range ofcurrent_addr to phys_ram_size while
no dirty blocks exist in the range 0 - (current_addr - 1)
2. Improve migration error handling
Thanks,
Yaniv
Quoted 1 line
From
d565b6b2246b0ac7c8ca292680f9134edb35caa7Mon Sep 17 00:00:00 2001
From: Yaniv Kamay <[email protected]>
Date: Tue, 24 Mar 2009 20:12:35 +0200
Subject: [PATCH] qemu: fix physical memory migration
--- qemu/hw/hw.h | 1 + qemu/migration.c | 7 ++++++- qemu/savevm.c | 5 +++++ qemu/vl.c | 19 +++++++++++++++---- 4 files changed, 27 insertions(+), 5 deletions(-)
qemu/hw/hw.h +1 -0
@@ -67,6 +67,7 @@ unsigned int qemu_get_be32(QEMUFile *f);uint64_t qemu_get_be64 (QEMUFile *f);int qemu_file_rate_limit (QEMUFile *f);int qemu_file_has_error (QEMUFile *f); +void qemu_file_set_has_error (QEMUFile *f);/* Try to send any outstanding data. This function is useful when output is * halted due to rate limiting or EAGAIN errors occur as it can be used to
qemu/migration.c +6 -1
@@ -225,7 +225,12 @@ void migrate_fd_put_ready(void *opaque)bdrv_flush_all ();qemu_savevm_state_complete (s->file); - s->state =MIG_STATE_COMPLETED ; +if (qemu_file_has_error (s->file)) { +vm_start (); + s->state =MIG_STATE_ERROR ; + }else { + s->state =MIG_STATE_COMPLETED ; + }migrate_fd_cleanup (s); } }
qemu/savevm.c +5 -0
@@ -370,6 +370,11 @@ int qemu_file_has_error(QEMUFile *f)return f->has_error; } +void qemu_file_set_has_error (QEMUFile *f) +{ + f->has_error =1 ; +} +void qemu_fflush (QEMUFile *f) {if (!f->put_buffer)
qemu/vl.c +15 -4
@@ -3221,8 +3221,14 @@ static int ram_save_block(QEMUFile *f)int found =0 ;while (addr < phys_ram_size) { -if (kvm_enabled () && current_addr ==0 ) -kvm_update_dirty_pages_log ();/* FIXME: propagate errors */ +if (kvm_enabled () && current_addr ==0 ) { +int r; +if ((r =kvm_update_dirty_pages_log ())) { +printf ("%s: update dirty pages log failed %d\n" , __FUNCTION__, r); +qemu_file_set_has_error (f);// for now: replacing FIXME with ugly hack +return 0 ; + } + }if (cpu_physical_memory_get_dirty (current_addr,MIGRATION_DIRTY_FLAG )) {uint8_t ch;
@@ -3293,10 +3299,15 @@ static int ram_save_live(QEMUFile *f, int stage, void *opaque)/* try transferring iterative blocks of memory */ if (stage ==3 ) { -cpu_physical_memory_set_dirty_tracking (0 ); - +int r; +if ((r =kvm_update_dirty_pages_log ())) { +printf ("%s: update dirty pages log failed %d\n" , __FUNCTION__, r); +qemu_file_set_has_error (f); +return 0 ; + }/* flush all remaining blocks regardless of rate limiting */ while (ram_save_block (f) !=0 ); +cpu_physical_memory_set_dirty_tracking (0 ); }qemu_put_be64 (f,RAM_SAVE_FLAG_EOS );
Signature · 1 line
1.6.0.2
Quoted 4 lines · Yaniv Kamay
Hi,
Attaching patch that:
Quoted 8 lines
1. Fix physical memory live migration.
- Stop dirty memory tracking after completion of memory transfer.
- In stage 3, updating dirty memory bits before collecting
remaining dirty blocks
in order to prevent missing dirty blokes in the range ofcurrent_addrtophys_ram_sizewhile
no dirty blocks exist in the range 0 - (current_addr- 1)
2. Improve migration error handling
Please split into three separate patches.
Quoted 2 lines
+void
qemu_file_set_has_error(QEMUFile *f);
Better named qemu_file_set_error()?
qemu/vl.c static int ram_save_block(QEMUFile *f) · line 3226
Quoted 13 lines
qemu/vl.c +3
-2@@ -3221,8 +3221,14 @@ static int ram_save_block(QEMUFile *f)int found =0 ;while (addr < phys_ram_size) { -if (kvm_enabled () && current_addr ==0 ) -kvm_update_dirty_pages_log ();/* FIXME: propagate errors */ +if (kvm_enabled () && current_addr ==0 ) { +int r; +if ((r =kvm_update_dirty_pages_log ())) {
Compare against negative; it could return positive numbers in the future even on no error.
qemu/vl.c static int ram_save_block(QEMUFile *f) · line 3228
Quoted 2 lines
qemu/vl.c +1
-0+printf ("%s: update dirty pages log failed %d\n" , __FUNCTION__, r);
qemu_log (in qemu-log.h)
Signature · 1 line
error compiling committee.c: too many arguments to function