mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 07:43:54 -06:00
savevm: New save live migration method: pending
Code just now does (simplified for clarity) if (qemu_savevm_state_iterate(s->file) == 1) { vm_stop_force_state(RUN_STATE_FINISH_MIGRATE); qemu_savevm_state_complete(s->file); } Problem here is that qemu_savevm_state_iterate() returns 1 when it knows that remaining memory to sent takes less than max downtime. But this means that we could end spending 2x max_downtime, one downtime in qemu_savevm_iterate, and the other in qemu_savevm_state_complete. Changed code to: pending_size = qemu_savevm_state_pending(s->file, max_size); DPRINTF("pending size %lu max %lu\n", pending_size, max_size); if (pending_size >= max_size) { ret = qemu_savevm_state_iterate(s->file); } else { vm_stop_force_state(RUN_STATE_FINISH_MIGRATE); qemu_savevm_state_complete(s->file); } So what we do is: at current network speed, we calculate the maximum number of bytes we can sent: max_size. Then we ask every save_live section how much they have pending. If they are less than max_size, we move to complete phase, otherwise we do an iterate one. This makes things much simpler, because now individual sections don't have to caluclate the bandwidth (it was implossible to do right from there). Signed-off-by: Juan Quintela <quintela@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
f50b4986b2
commit
e4ed1541ac
8 changed files with 83 additions and 84 deletions
|
@ -81,7 +81,7 @@ void migrate_fd_connect(MigrationState *s);
|
|||
|
||||
ssize_t migrate_fd_put_buffer(MigrationState *s, const void *data,
|
||||
size_t size);
|
||||
void migrate_fd_put_ready(MigrationState *s);
|
||||
bool migrate_fd_put_ready(MigrationState *s, uint64_t max_size);
|
||||
int migrate_fd_close(MigrationState *s);
|
||||
|
||||
void add_migration_state_change_notifier(Notifier *notify);
|
||||
|
|
|
@ -35,6 +35,7 @@ typedef struct SaveVMHandlers {
|
|||
int (*save_live_setup)(QEMUFile *f, void *opaque);
|
||||
int (*save_live_iterate)(QEMUFile *f, void *opaque);
|
||||
int (*save_live_complete)(QEMUFile *f, void *opaque);
|
||||
uint64_t (*save_live_pending)(QEMUFile *f, void *opaque, uint64_t max_size);
|
||||
void (*cancel)(void *opaque);
|
||||
LoadStateHandler *load_state;
|
||||
bool (*is_active)(void *opaque);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue