| Submitter | Paolo Bonzini |
|---|---|
| Date | Feb. 15, 2013, 5:46 p.m. |
| Message ID | <1360950433-17106-22-git-send-email-pbonzini@redhat.com> |
| Download | mbox | patch |
| Permalink | /patch/220791/ |
| State | New |
| Headers | show |
Comments
On 02/15/2013 07:46 PM, Paolo Bonzini wrote: > Only the migration_bitmap_sync() call needs the iothread lock. > > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> > --- > arch_init.c | 10 ++++++---- > block-migration.c | 2 ++ > include/migration/vmstate.h | 2 +- > migration.c | 2 -- > savevm.c | 3 +++ > 5 files changed, 12 insertions(+), 7 deletions(-) > > diff --git a/arch_init.c b/arch_init.c > index adca555..6f0e389 100644 > --- a/arch_init.c > +++ b/arch_init.c > @@ -569,10 +569,6 @@ static int ram_save_setup(QEMUFile *f, void *opaque) > bitmap_set(migration_bitmap, 0, ram_pages); > migration_dirty_pages = ram_pages; > > - qemu_mutex_lock_ramlist(); > - bytes_transferred = 0; > - reset_ram_globals(); > - > if (migrate_use_xbzrle()) { > XBZRLE.cache = cache_init(migrate_xbzrle_cache_size() / > TARGET_PAGE_SIZE, > @@ -586,8 +582,14 @@ static int ram_save_setup(QEMUFile *f, void *opaque) > acct_clear(); > } > > + qemu_mutex_lock_iothread(); > + qemu_mutex_lock_ramlist(); > + bytes_transferred = 0; > + reset_ram_globals(); > + > memory_global_dirty_log_start(); > migration_bitmap_sync(); > + qemu_mutex_unlock_iothread(); > > qemu_put_be64(f, ram_bytes_total() | RAM_SAVE_FLAG_MEM_SIZE); > > diff --git a/block-migration.c b/block-migration.c > index 143180c..d673658 100644 > --- a/block-migration.c > +++ b/block-migration.c > @@ -583,10 +583,12 @@ static int block_save_setup(QEMUFile *f, void *opaque) > DPRINTF("Enter save live setup submitted %d transferred %d\n", > block_mig_state.submitted, block_mig_state.transferred); > > + qemu_mutex_lock_iothread(); > init_blk_migration(f); > > /* start track dirty blocks */ > set_dirty_tracking(1); > + qemu_mutex_unlock_iothread(); > > ret = flush_blks(f); > blk_mig_reset_dirty_cursor(); > diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h > index 5f803f5..abc3b47 100644 > --- a/include/migration/vmstate.h > +++ b/include/migration/vmstate.h > @@ -34,7 +34,6 @@ typedef struct SaveVMHandlers { > void (*set_params)(const MigrationParams *params, void * opaque); > SaveStateHandler *save_state; > > - int (*save_live_setup)(QEMUFile *f, void *opaque); > void (*cancel)(void *opaque); > int (*save_live_complete)(QEMUFile *f, void *opaque); > > @@ -49,6 +48,7 @@ typedef struct SaveVMHandlers { > int (*save_live_iterate)(QEMUFile *f, void *opaque); > > /* This runs outside the iothread lock! */ > + int (*save_live_setup)(QEMUFile *f, void *opaque); > uint64_t (*save_live_pending)(QEMUFile *f, void *opaque, uint64_t max_size); > > LoadStateHandler *load_state; > diff --git a/migration.c b/migration.c > index cb7f7b4..d6a7dff 100644 > --- a/migration.c > +++ b/migration.c > @@ -648,10 +648,8 @@ static void *buffered_file_thread(void *opaque) > bool old_vm_running = false; > bool last_round = false; > > - qemu_mutex_lock_iothread(); > DPRINTF("beginning savevm\n"); > qemu_savevm_state_begin(s->file, &s->params); > - qemu_mutex_unlock_iothread(); > > while (s->state == MIG_STATE_ACTIVE) { > int64_t current_time = qemu_get_clock_ms(rt_clock); > diff --git a/savevm.c b/savevm.c > index e10a045..7c7774e 100644 > --- a/savevm.c > +++ b/savevm.c > @@ -1768,7 +1768,10 @@ static int qemu_savevm_state(QEMUFile *f) > return -EINVAL; > } > > + qemu_mutex_unlock_iothread(); > qemu_savevm_state_begin(f, ¶ms); > + qemu_mutex_lock_iothread(); > + > while (qemu_file_get_error(f) == 0) { > if (qemu_savevm_state_iterate(f) > 0) { > break; > Reviewed-by: Orit Wasserman <owasserm@redhat.com>
Paolo Bonzini <pbonzini@redhat.com> wrote: > Only the migration_bitmap_sync() call needs the iothread lock. > > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Juan Quintela <quintela@redhat.com>
Patch
diff --git a/arch_init.c b/arch_init.c index adca555..6f0e389 100644 --- a/arch_init.c +++ b/arch_init.c @@ -569,10 +569,6 @@ static int ram_save_setup(QEMUFile *f, void *opaque) bitmap_set(migration_bitmap, 0, ram_pages); migration_dirty_pages = ram_pages; - qemu_mutex_lock_ramlist(); - bytes_transferred = 0; - reset_ram_globals(); - if (migrate_use_xbzrle()) { XBZRLE.cache = cache_init(migrate_xbzrle_cache_size() / TARGET_PAGE_SIZE, @@ -586,8 +582,14 @@ static int ram_save_setup(QEMUFile *f, void *opaque) acct_clear(); } + qemu_mutex_lock_iothread(); + qemu_mutex_lock_ramlist(); + bytes_transferred = 0; + reset_ram_globals(); + memory_global_dirty_log_start(); migration_bitmap_sync(); + qemu_mutex_unlock_iothread(); qemu_put_be64(f, ram_bytes_total() | RAM_SAVE_FLAG_MEM_SIZE); diff --git a/block-migration.c b/block-migration.c index 143180c..d673658 100644 --- a/block-migration.c +++ b/block-migration.c @@ -583,10 +583,12 @@ static int block_save_setup(QEMUFile *f, void *opaque) DPRINTF("Enter save live setup submitted %d transferred %d\n", block_mig_state.submitted, block_mig_state.transferred); + qemu_mutex_lock_iothread(); init_blk_migration(f); /* start track dirty blocks */ set_dirty_tracking(1); + qemu_mutex_unlock_iothread(); ret = flush_blks(f); blk_mig_reset_dirty_cursor(); diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h index 5f803f5..abc3b47 100644 --- a/include/migration/vmstate.h +++ b/include/migration/vmstate.h @@ -34,7 +34,6 @@ typedef struct SaveVMHandlers { void (*set_params)(const MigrationParams *params, void * opaque); SaveStateHandler *save_state; - int (*save_live_setup)(QEMUFile *f, void *opaque); void (*cancel)(void *opaque); int (*save_live_complete)(QEMUFile *f, void *opaque); @@ -49,6 +48,7 @@ typedef struct SaveVMHandlers { int (*save_live_iterate)(QEMUFile *f, void *opaque); /* This runs outside the iothread lock! */ + int (*save_live_setup)(QEMUFile *f, void *opaque); uint64_t (*save_live_pending)(QEMUFile *f, void *opaque, uint64_t max_size); LoadStateHandler *load_state; diff --git a/migration.c b/migration.c index cb7f7b4..d6a7dff 100644 --- a/migration.c +++ b/migration.c @@ -648,10 +648,8 @@ static void *buffered_file_thread(void *opaque) bool old_vm_running = false; bool last_round = false; - qemu_mutex_lock_iothread(); DPRINTF("beginning savevm\n"); qemu_savevm_state_begin(s->file, &s->params); - qemu_mutex_unlock_iothread(); while (s->state == MIG_STATE_ACTIVE) { int64_t current_time = qemu_get_clock_ms(rt_clock); diff --git a/savevm.c b/savevm.c index e10a045..7c7774e 100644 --- a/savevm.c +++ b/savevm.c @@ -1768,7 +1768,10 @@ static int qemu_savevm_state(QEMUFile *f) return -EINVAL; } + qemu_mutex_unlock_iothread(); qemu_savevm_state_begin(f, ¶ms); + qemu_mutex_lock_iothread(); + while (qemu_file_get_error(f) == 0) { if (qemu_savevm_state_iterate(f) > 0) { break;
Only the migration_bitmap_sync() call needs the iothread lock. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- arch_init.c | 10 ++++++---- block-migration.c | 2 ++ include/migration/vmstate.h | 2 +- migration.c | 2 -- savevm.c | 3 +++ 5 files changed, 12 insertions(+), 7 deletions(-)