Refactor and cleanup migration code
v3 cover Refactor and cleanup migration code
Hi
this patch applies on top of my previous "migration error" patches. All error handling has been moved to that series, except for "propagate error correctly", without this refactoring, it is quite complicated to apply it.
Please, review.
Later, Juan.
v3:
- more checkpatch.pl happines
- split error handling in a previous series
- make Anthony happy. current_migration is still a pointer, but points to a static variable. We can change current_migration when we integrate kemari.
v2:
- make Jan^Wcheckpatch.pl happy
- Yoshiaki Tamura suggestions:
- include its two patches to clean things
- MAX_THROTTLE define
- migration_state enum
- I removed spurious differences between migration-{tcp,unix}
- better error propagation, after this patch:
migrate -d "tcp:name_don_exist:port"
migrate -d "tcp:name:port_dont_exist"
migrate -d "exec: prog_dont_exist"
migrate -d "exec: gzip > /path/dont/exist"
fail as expected. Last two used to enter an infinite loop.
The fixes part should be backported to 0.14, waiting for the review to do that.
Later, Juan.
v1:
This series:
- Fold MigrationState into FdMigrationState (and then rename)
- Factorize migration statec creation in a single place
- Make use of MIG_STATE_*, setup through helpers and make them local
- remove relase & cancel callbacks (where used only one in same file than defined)
- get_status() is no more, just access directly to .state
- current_migration use cleanup, and make variable static
- max_throotle is gone, now inside current_migration
- change get_migration_status() to migration_has_finished() and actualize single user.
Please review.
Later, Juan.
*** BLURB HERE ***
Juan Quintela (23):
migration: Make *start_outgoing_migration return FdMigrationState
migration: Use FdMigrationState instead of MigrationState when
possible
migration: Fold MigrationState into FdMigrationState
migration: Rename FdMigrationState MigrationState
migration: Refactor MigrationState creation
migration: Make all posible migration functions static
migration: move migrate_create_state to do_migrate
migration: Introduce MIG_STATE_NONE
migration: Refactor and simplify error checking in
migrate_fd_put_ready
migration: Introduce migrate_fd_completed() for consistency
migration: Our release callback was just free
migration: Remove get_status() accessor
migration: Remove migration cancel() callback
migration: Move exported functions to the end of the file
migration: use global variable directly
migration: another case of global variable assigned to local one
migration: make sure we always have a migration state
migration: Use bandwidth_limit directly
migration: Export a function that tells if the migration has finished
correctly
migration: Make state definitions local
migration: Don't use callback on file defining it
migration: propagate error correctly
migration: make migration-{tcp,unix} consistent
migration-exec.c | 39 +---- migration-fd.c | 42 ++----- migration-tcp.c | 76 ++++------ migration-unix.c | 112 ++++++--------- migration.c | 400 ++++++++++++++++++++++++++---------------------------- migration.h | 85 ++---------- ui/spice-core.c | 4 +- 7 files changed, 300 insertions(+), 458 deletions(-)
Signature · 1 line
1.7.6.2
PATCH v3 3/23 migration: Fold MigrationState into FdMigrationState
--- migration-exec.c | 10 +++++----- migration-fd.c | 10 +++++----- migration-tcp.c | 10 +++++----- migration-unix.c | 10 +++++----- migration.c | 14 ++++++-------- migration.h | 23 +++++------------------ 6 files changed, 31 insertions(+), 46 deletions(-)
migration-exec.c +5 -5
@@ -92,12 +92,12 @@ FdMigrationState *exec_start_outgoing_migration(Monitor *mon, s->close = exec_close; s->get_error = file_errno; s->write = file_write; - s->mig_state.cancel = migrate_fd_cancel; - s->mig_state.get_status = migrate_fd_get_status; - s->mig_state.release = migrate_fd_release; + s->cancel = migrate_fd_cancel; + s->get_status = migrate_fd_get_status; + s->release = migrate_fd_release; - s->mig_state.blk = blk; - s->mig_state.shared = inc; + s->blk = blk; + s->shared = inc; s->state =MIG_STATE_ACTIVE ; s->mon =NULL ;
migration-fd.c +5 -5
@@ -75,12 +75,12 @@ FdMigrationState *fd_start_outgoing_migration(Monitor *mon, s->get_error = fd_errno; s->write = fd_write; s->close = fd_close; - s->mig_state.cancel = migrate_fd_cancel; - s->mig_state.get_status = migrate_fd_get_status; - s->mig_state.release = migrate_fd_release; + s->cancel = migrate_fd_cancel; + s->get_status = migrate_fd_get_status; + s->release = migrate_fd_release; - s->mig_state.blk = blk; - s->mig_state.shared = inc; + s->blk = blk; + s->shared = inc; s->state =MIG_STATE_ACTIVE ; s->mon =NULL ;
migration-tcp.c +5 -5
@@ -94,12 +94,12 @@ FdMigrationState *tcp_start_outgoing_migration(Monitor *mon, s->get_error = socket_errno; s->write = socket_write; s->close = tcp_close; - s->mig_state.cancel = migrate_fd_cancel; - s->mig_state.get_status = migrate_fd_get_status; - s->mig_state.release = migrate_fd_release; + s->cancel = migrate_fd_cancel; + s->get_status = migrate_fd_get_status; + s->release = migrate_fd_release; - s->mig_state.blk = blk; - s->mig_state.shared = inc; + s->blk = blk; + s->shared = inc; s->state =MIG_STATE_ACTIVE ; s->mon =NULL ;
migration-unix.c +5 -5
@@ -93,12 +93,12 @@ FdMigrationState *unix_start_outgoing_migration(Monitor *mon, s->get_error = unix_errno; s->write = unix_write; s->close = unix_close; - s->mig_state.cancel = migrate_fd_cancel; - s->mig_state.get_status = migrate_fd_get_status; - s->mig_state.release = migrate_fd_release; + s->cancel = migrate_fd_cancel; + s->get_status = migrate_fd_get_status; + s->release = migrate_fd_release; - s->mig_state.blk = blk; - s->mig_state.shared = inc; + s->blk = blk; + s->shared = inc; s->state =MIG_STATE_ACTIVE ; s->mon =NULL ;
migration.c +6 -8
@@ -86,8 +86,7 @@ int do_migrate(Monitor *mon, const QDict *qdict, QObject **ret_data)const char *uri =qdict_get_str (qdict,"uri" );if (current_migration && - current_migration->mig_state.get_status (current_migration) == -MIG_STATE_ACTIVE ) { + current_migration->get_status (current_migration) ==MIG_STATE_ACTIVE ) {monitor_printf (mon,"migration already in progress\n" );return -1 ; }
@@ -121,7 +120,7 @@ int do_migrate(Monitor *mon, const QDict *qdict, QObject **ret_data) }if (current_migration) { - current_migration->mig_state.release (current_migration); + current_migration->release (current_migration); } current_migration = s;
@@ -133,8 +132,8 @@ int do_migrate_cancel(Monitor *mon, const QDict *qdict, QObject **ret_data) {FdMigrationState *s = current_migration; -if (s && s->mig_state.get_status (s) ==MIG_STATE_ACTIVE ) { - s->mig_state.cancel (s); +if (s && s->get_status (s) ==MIG_STATE_ACTIVE ) { + s->cancel (s); }return 0 ; }
@@ -230,7 +229,7 @@ void do_info_migrate(Monitor *mon, QObject **ret_data)QDict *qdict;if (current_migration) { -MigrationState *s = ¤t_migration->mig_state; +FdMigrationState *s = current_migration;switch (s->get_status (current_migration)) {case MIG_STATE_ACTIVE :
@@ -350,8 +349,7 @@ void migrate_fd_connect(FdMigrationState *s) migrate_fd_close);DPRINTF ("beginning savevm\n" ); - ret =qemu_savevm_state_begin (s->mon, s->file, s->mig_state.blk, - s->mig_state.shared); + ret =qemu_savevm_state_begin (s->mon, s->file, s->blk, s->shared);if (ret <0 ) {DPRINTF ("failed, %d\n" , ret);migrate_fd_error (s);
migration.h +5 -18
@@ -23,23 +23,10 @@#define MIG_STATE_CANCELLED 1#define MIG_STATE_ACTIVE 2 -typedef struct MigrationState MigrationState ; -typedef struct FdMigrationState FdMigrationState ; -struct MigrationState -{ -/* FIXME: add more accessors to print migration info */ -void (*cancel)(FdMigrationState *s); -int (*get_status)(FdMigrationState *s); -void (*release)(FdMigrationState *s); -int blk; -int shared; -}; -struct FdMigrationState { -MigrationState mig_state;int64_t bandwidth_limit;QEMUFile *file;int fd;
@@ -48,7 +35,12 @@ struct FdMigrationStateint (*get_error)(struct FdMigrationState *);int (*close)(struct FdMigrationState *,bool flush);int (*write)(struct FdMigrationState *,const void *,size_t ); +void (*cancel)(FdMigrationState *s); +int (*get_status)(FdMigrationState *s); +void (*release)(FdMigrationState *s);void *opaque; +int blk; +int shared; };void process_incoming_migration (QEMUFile *f);
@@ -130,11 +122,6 @@ void migrate_fd_wait_for_unfreeze(void *opaque);int migrate_fd_close (void *opaque,bool flush); -static inline FdMigrationState *migrate_to_fms (MigrationState *mig_state) -{ -return container_of (mig_state, FdMigrationState, mig_state); -} -void add_migration_state_change_notifier (Notifier *notify);void remove_migration_state_change_notifier (Notifier *notify);int get_migration_state (void );
Signature · 1 line
1.7.6.2
PATCH v3 5/23 migration: Refactor MigrationState creation
In reply to Juan Quintela--- migration-exec.c | 16 +--------------- migration-fd.c | 16 +--------------- migration-tcp.c | 15 +-------------- migration-unix.c | 15 +-------------- migration.c | 29 +++++++++++++++++++++++++---- migration.h | 11 +++-------- 6 files changed, 32 insertions(+), 70 deletions(-)
migration-exec.c +1 -15
@@ -71,7 +71,7 @@ MigrationState *exec_start_outgoing_migration(Monitor *mon,MigrationState *s;FILE *f; - s =g_malloc0 (sizeof (*s)); + s =migrate_create_state (mon, bandwidth_limit, detach, blk, inc); f =popen (command,"w" );if (f ==NULL ) {
@@ -92,20 +92,6 @@ MigrationState *exec_start_outgoing_migration(Monitor *mon, s->close = exec_close; s->get_error = file_errno; s->write = file_write; - s->cancel = migrate_fd_cancel; - s->get_status = migrate_fd_get_status; - s->release = migrate_fd_release; - - s->blk = blk; - s->shared = inc; - - s->state =MIG_STATE_ACTIVE ; - s->mon =NULL ; - s->bandwidth_limit = bandwidth_limit; - -if (!detach) { -migrate_fd_monitor_suspend (s, mon); - }migrate_fd_connect (s);return s;
migration-fd.c +1 -15
@@ -59,7 +59,7 @@ MigrationState *fd_start_outgoing_migration(Monitor *mon, {MigrationState *s; - s =g_malloc0 (sizeof (*s)); + s =migrate_create_state (mon, bandwidth_limit, detach, blk, inc); s->fd =monitor_get_fd (mon, fdname);if (s->fd ==-1 ) {
@@ -75,20 +75,6 @@ MigrationState *fd_start_outgoing_migration(Monitor *mon, s->get_error = fd_errno; s->write = fd_write; s->close = fd_close; - s->cancel = migrate_fd_cancel; - s->get_status = migrate_fd_get_status; - s->release = migrate_fd_release; - - s->blk = blk; - s->shared = inc; - - s->state =MIG_STATE_ACTIVE ; - s->mon =NULL ; - s->bandwidth_limit = bandwidth_limit; - -if (!detach) { -migrate_fd_monitor_suspend (s, mon); - }migrate_fd_connect (s);return s;
migration-tcp.c +1 -14
@@ -89,21 +89,12 @@ MigrationState *tcp_start_outgoing_migration(Monitor *mon,if (parse_host_port (&addr, host_port) <0 )return NULL ; - s =g_malloc0 (sizeof (*s)); + s =migrate_create_state (mon, bandwidth_limit, detach, blk, inc); s->get_error = socket_errno; s->write = socket_write; s->close = tcp_close; - s->cancel = migrate_fd_cancel; - s->get_status = migrate_fd_get_status; - s->release = migrate_fd_release; - s->blk = blk; - s->shared = inc; - - s->state =MIG_STATE_ACTIVE ; - s->mon =NULL ; - s->bandwidth_limit = bandwidth_limit; s->fd =qemu_socket (PF_INET ,SOCK_STREAM ,0 );if (s->fd ==-1 ) {g_free (s);
@@ -112,10 +103,6 @@ MigrationState *tcp_start_outgoing_migration(Monitor *mon,socket_set_nonblock (s->fd); -if (!detach) { -migrate_fd_monitor_suspend (s, mon); - } - do { ret = connect(s->fd, (struct sockaddr *)&addr, sizeof(addr)); if (ret == -1)
migration-unix.c +1 -14
@@ -88,21 +88,12 @@ MigrationState *unix_start_outgoing_migration(Monitor *mon, addr.sun_family =AF_UNIX ;snprintf (addr.sun_path,sizeof (addr.sun_path),"%s" , path); - s =g_malloc0 (sizeof (*s)); + s =migrate_create_state (mon, bandwidth_limit, detach, blk, inc); s->get_error = unix_errno; s->write = unix_write; s->close = unix_close; - s->cancel = migrate_fd_cancel; - s->get_status = migrate_fd_get_status; - s->release = migrate_fd_release; - s->blk = blk; - s->shared = inc; - - s->state =MIG_STATE_ACTIVE ; - s->mon =NULL ; - s->bandwidth_limit = bandwidth_limit; s->fd =qemu_socket (PF_UNIX ,SOCK_STREAM ,0 );if (s->fd <0 ) {DPRINTF ("Unable to open socket" );
@@ -125,10 +116,6 @@ MigrationState *unix_start_outgoing_migration(Monitor *mon, goto err_after_open; } -if (!detach) { -migrate_fd_monitor_suspend (s, mon); - } -if (ret >=0 )migrate_fd_connect (s);
migration.c +25 -4
@@ -262,7 +262,7 @@ void do_info_migrate(Monitor *mon, QObject **ret_data)/* shared migration helpers */ -void migrate_fd_monitor_suspend (MigrationState *s,Monitor *mon) +static void migrate_fd_monitor_suspend (MigrationState *s,Monitor *mon) { s->mon = mon;if (monitor_suspend (mon) ==0 ) {
@@ -398,12 +398,12 @@ void migrate_fd_put_ready(void *opaque) } } -int migrate_fd_get_status (MigrationState *s) +static int migrate_fd_get_status (MigrationState *s) {return s->state; } -void migrate_fd_cancel (MigrationState *s) +static void migrate_fd_cancel (MigrationState *s) {if (s->state !=MIG_STATE_ACTIVE )return ;
@@ -417,7 +417,7 @@ void migrate_fd_cancel(MigrationState *s)migrate_fd_cleanup (s); } -void migrate_fd_release (MigrationState *s) +static void migrate_fd_release (MigrationState *s) {DPRINTF ("releasing state\n" );
@@ -478,3 +478,24 @@ int get_migration_state(void)return MIG_STATE_ERROR ; } } + +MigrationState *migrate_create_state (Monitor *mon,int64_t bandwidth_limit, +int detach,int blk,int inc) +{ +MigrationState *s =g_malloc0 (sizeof (*s)); + + s->cancel = migrate_fd_cancel; + s->get_status = migrate_fd_get_status; + s->release = migrate_fd_release; + s->blk = blk; + s->shared = inc; + s->mon =NULL ; + s->bandwidth_limit = bandwidth_limit; + s->state =MIG_STATE_ACTIVE ; + +if (!detach) { +migrate_fd_monitor_suspend (s, mon); + } + +return s; +}
migration.h +3 -8
@@ -98,8 +98,6 @@ MigrationState *fd_start_outgoing_migration(Monitor *mon,int blk, int inc); -void migrate_fd_monitor_suspend (MigrationState *s,Monitor *mon); -void migrate_fd_error (MigrationState *s);int migrate_fd_cleanup (MigrationState *s);
@@ -112,16 +110,13 @@ void migrate_fd_connect(MigrationState *s);void migrate_fd_put_ready (void *opaque); -int migrate_fd_get_status (MigrationState *mig_state); - -void migrate_fd_cancel (MigrationState *mig_state); - -void migrate_fd_release (MigrationState *mig_state); -void migrate_fd_wait_for_unfreeze (void *opaque);int migrate_fd_close (void *opaque,bool flush); +MigrationState *migrate_create_state (Monitor *mon,int64_t bandwidth_limit, +int detach,int blk,int inc); +void add_migration_state_change_notifier (Notifier *notify);void remove_migration_state_change_notifier (Notifier *notify);int get_migration_state (void );
Signature · 1 line
1.7.6.2
PATCH v3 1/23 migration: Make *start_outgoing_migration return FdMigrationState
In reply to Juan Quintela--- migration-exec.c | 4 ++-- migration-fd.c | 4 ++-- migration-tcp.c | 4 ++-- migration-unix.c | 4 ++-- migration.c | 4 ++-- migration.h | 8 ++++---- 6 files changed, 14 insertions(+), 14 deletions(-)
migration-exec.c +2 -2
@@ -61,7 +61,7 @@ static int exec_close(FdMigrationState *s, bool flush)return ret; } -MigrationState *exec_start_outgoing_migration(Monitor *mon, +FdMigrationState *exec_start_outgoing_migration(Monitor *mon, const char *command, int64_t bandwidth_limit, int detach,
@@ -108,7 +108,7 @@ MigrationState *exec_start_outgoing_migration(Monitor *mon, }migrate_fd_connect (s); -return &s->mig_state; +return s; err_after_open:pclose (f);
migration-fd.c +2 -2
@@ -50,7 +50,7 @@ static int fd_close(FdMigrationState *s, bool flush)return 0 ; } -MigrationState *fd_start_outgoing_migration(Monitor *mon, +FdMigrationState *fd_start_outgoing_migration(Monitor *mon, const char *fdname, int64_t bandwidth_limit, int detach,
@@ -91,7 +91,7 @@ MigrationState *fd_start_outgoing_migration(Monitor *mon, }migrate_fd_connect (s); -return &s->mig_state; +return s; err_after_open:close (s->fd);
migration-tcp.c +2 -2
@@ -75,7 +75,7 @@ static void tcp_wait_for_connect(void *opaque) } } -MigrationState *tcp_start_outgoing_migration(Monitor *mon, +FdMigrationState *tcp_start_outgoing_migration(Monitor *mon, const char *host_port, int64_t bandwidth_limit, int detach,
@@ -131,7 +131,7 @@ MigrationState *tcp_start_outgoing_migration(Monitor *mon, }else if (ret >=0 )migrate_fd_connect (s); -return &s->mig_state; +return s; }static void tcp_accept_incoming_migration (void *opaque)
migration-unix.c +2 -2
@@ -74,7 +74,7 @@ static void unix_wait_for_connect(void *opaque) } } -MigrationState *unix_start_outgoing_migration(Monitor *mon, +FdMigrationState *unix_start_outgoing_migration(Monitor *mon, const char *path, int64_t bandwidth_limit, int detach,
@@ -132,7 +132,7 @@ MigrationState *unix_start_outgoing_migration(Monitor *mon,if (ret >=0 )migrate_fd_connect (s); -return &s->mig_state; +return s; err_after_open:close (s->fd);
migration.c +2 -2
@@ -78,7 +78,7 @@ void process_incoming_migration(QEMUFile *f)int do_migrate (Monitor *mon,const QDict *qdict,QObject **ret_data) { -MigrationState *s =NULL ; +FdMigrationState *s =NULL ;const char *p;int detach =qdict_get_try_bool (qdict,"detach" ,0 );int blk =qdict_get_try_bool (qdict,"blk" ,0 );
@@ -123,7 +123,7 @@ int do_migrate(Monitor *mon, const QDict *qdict, QObject **ret_data) current_migration->release (current_migration); } - current_migration = s; + current_migration = &s->mig_state;notifier_list_notify (&migration_state_notifiers,NULL );return 0 ; }
migration.h +4 -4
@@ -72,7 +72,7 @@ void do_info_migrate(Monitor *mon, QObject **ret_data);int exec_start_incoming_migration (const char *host_port); -MigrationState *exec_start_outgoing_migration(Monitor *mon, +FdMigrationState *exec_start_outgoing_migration(Monitor *mon, const char *host_port, int64_t bandwidth_limit, int detach,
@@ -81,7 +81,7 @@ MigrationState *exec_start_outgoing_migration(Monitor *mon,int tcp_start_incoming_migration (const char *host_port); -MigrationState *tcp_start_outgoing_migration(Monitor *mon, +FdMigrationState *tcp_start_outgoing_migration(Monitor *mon, const char *host_port, int64_t bandwidth_limit, int detach,
@@ -90,7 +90,7 @@ MigrationState *tcp_start_outgoing_migration(Monitor *mon,int unix_start_incoming_migration (const char *path); -MigrationState *unix_start_outgoing_migration(Monitor *mon, +FdMigrationState *unix_start_outgoing_migration(Monitor *mon, const char *path, int64_t bandwidth_limit, int detach,
@@ -99,7 +99,7 @@ MigrationState *unix_start_outgoing_migration(Monitor *mon,int fd_start_incoming_migration (const char *path); -MigrationState *fd_start_outgoing_migration(Monitor *mon, +FdMigrationState *fd_start_outgoing_migration(Monitor *mon, const char *fdname, int64_t bandwidth_limit, int detach,
Signature · 1 line
1.7.6.2
PATCH v3 10/23 migration: Introduce migrate_fd_completed() for consistency
In reply to Juan QuintelaThis function is a bit different of the others that change the state, in the sense that if migrate_fd_cleanup() returns an error, it set the status to error, not completed.
--- migration.c | 18 ++++++++++++------ 1 files changed, 12 insertions(+), 6 deletions(-)
migration.c +12 -6
@@ -317,6 +317,17 @@ void migrate_fd_error(MigrationState *s)migrate_fd_cleanup (s); } +static void migrate_fd_completed (MigrationState *s) +{ +DPRINTF ("setting completed state\n" ); +if (migrate_fd_cleanup (s) <0 ) { + s->state =MIG_STATE_ERROR ; + }else { + s->state =MIG_STATE_COMPLETED ; + } +notifier_list_notify (&migration_state_notifiers,NULL ); +} +static void migrate_fd_put_notify (void *opaque) {MigrationState *s = opaque;
@@ -371,12 +382,7 @@ static void migrate_fd_put_ready(void *opaque)if (qemu_savevm_state_complete (s->mon, s->file) <0 ) {migrate_fd_error (s); }else { -if (migrate_fd_cleanup (s) <0 ) { -migrate_fd_error (s); - }else { - s->state =MIG_STATE_COMPLETED ; -notifier_list_notify (&migration_state_notifiers,NULL ); - } +migrate_fd_completed (s); }if (s->get_status (s) !=MIG_STATE_COMPLETED ) {if (old_vm_running) {
Signature · 1 line
1.7.6.2
PATCH v3 2/23 migration: Use FdMigrationState instead of MigrationState when possible
In reply to Juan Quintela--- migration.c | 34 ++++++++++++++++------------------ migration.h | 16 ++++++++-------- 2 files changed, 24 insertions(+), 26 deletions(-)
migration.c +16 -18
@@ -34,7 +34,7 @@/* Migration speed throttling */ static int64_t max_throttle = (32 <<20 ); -static MigrationState *current_migration; +static FdMigrationState *current_migration;static NotifierList migration_state_notifiers =NOTIFIER_LIST_INITIALIZER (migration_state_notifiers);
@@ -86,7 +86,8 @@ int do_migrate(Monitor *mon, const QDict *qdict, QObject **ret_data)const char *uri =qdict_get_str (qdict,"uri" );if (current_migration && - current_migration->get_status (current_migration) ==MIG_STATE_ACTIVE ) { + current_migration->mig_state.get_status (current_migration) == +MIG_STATE_ACTIVE ) {monitor_printf (mon,"migration already in progress\n" );return -1 ; }
@@ -120,20 +121,20 @@ int do_migrate(Monitor *mon, const QDict *qdict, QObject **ret_data) }if (current_migration) { - current_migration->release (current_migration); + current_migration->mig_state.release (current_migration); } - current_migration = &s->mig_state; + current_migration = s;notifier_list_notify (&migration_state_notifiers,NULL );return 0 ; }int do_migrate_cancel (Monitor *mon,const QDict *qdict,QObject **ret_data) { -MigrationState *s = current_migration; +FdMigrationState *s = current_migration; -if (s && s->get_status (s) ==MIG_STATE_ACTIVE ) { - s->cancel (s); +if (s && s->mig_state.get_status (s) ==MIG_STATE_ACTIVE ) { + s->mig_state.cancel (s); }return 0 ; }
@@ -149,7 +150,7 @@ int do_migrate_set_speed(Monitor *mon, const QDict *qdict, QObject **ret_data) } max_throttle = d; - s =migrate_to_fms (current_migration); + s = current_migration;if (s && s->file) {qemu_file_set_rate_limit (s->file, max_throttle); }
@@ -227,10 +228,11 @@ static void migrate_put_status(QDict *qdict, const char *name,void do_info_migrate (Monitor *mon,QObject **ret_data) {QDict *qdict; -MigrationState *s = current_migration; -if (s) { -switch (s->get_status (s)) { +if (current_migration) { +MigrationState *s = ¤t_migration->mig_state; + +switch (s->get_status (current_migration)) {case MIG_STATE_ACTIVE : qdict =qdict_new ();qdict_put (qdict,"status" ,qstring_from_str ("active" ));
@@ -398,16 +400,13 @@ void migrate_fd_put_ready(void *opaque) } } -int migrate_fd_get_status (MigrationState *mig_state) +int migrate_fd_get_status (FdMigrationState *s) { -FdMigrationState *s =migrate_to_fms (mig_state);return s->state; } -void migrate_fd_cancel (MigrationState *mig_state) +void migrate_fd_cancel (FdMigrationState *s) { -FdMigrationState *s =migrate_to_fms (mig_state); -if (s->state !=MIG_STATE_ACTIVE )return ;
@@ -420,9 +419,8 @@ void migrate_fd_cancel(MigrationState *mig_state)migrate_fd_cleanup (s); } -void migrate_fd_release (MigrationState *mig_state) +void migrate_fd_release (FdMigrationState *s) { -FdMigrationState *s =migrate_to_fms (mig_state);DPRINTF ("releasing state\n" );
migration.h +8 -8
@@ -25,18 +25,18 @@typedef struct MigrationState MigrationState ; +typedef struct FdMigrationState FdMigrationState ; +struct MigrationState {/* FIXME: add more accessors to print migration info */ -void (*cancel)(MigrationState *s); -int (*get_status)(MigrationState *s); -void (*release)(MigrationState *s); +void (*cancel)(FdMigrationState *s); +int (*get_status)(FdMigrationState *s); +void (*release)(FdMigrationState *s);int blk;int shared; }; -typedef struct FdMigrationState FdMigrationState ; -struct FdMigrationState {MigrationState mig_state;
@@ -120,11 +120,11 @@ void migrate_fd_connect(FdMigrationState *s);void migrate_fd_put_ready (void *opaque); -int migrate_fd_get_status (MigrationState *mig_state); +int migrate_fd_get_status (FdMigrationState *mig_state); -void migrate_fd_cancel (MigrationState *mig_state); +void migrate_fd_cancel (FdMigrationState *mig_state); -void migrate_fd_release (MigrationState *mig_state); +void migrate_fd_release (FdMigrationState *mig_state);void migrate_fd_wait_for_unfreeze (void *opaque);
Signature · 1 line
1.7.6.2
PATCH v3 4/23 migration: Rename FdMigrationState MigrationState
In reply to Juan Quintela--- migration-exec.c | 10 +++++----- migration-fd.c | 10 +++++----- migration-tcp.c | 12 ++++++------ migration-unix.c | 12 ++++++------ migration.c | 34 +++++++++++++++++----------------- migration.h | 38 +++++++++++++++++++------------------- 6 files changed, 58 insertions(+), 58 deletions(-)
migration-exec.c +5 -5
@@ -32,17 +32,17 @@ do { } while (0)#endif -static int file_errno (FdMigrationState *s) +static int file_errno (MigrationState *s) {return errno; } -static int file_write (FdMigrationState *s,const void * buf,size_t size) +static int file_write (MigrationState *s,const void * buf,size_t size) {return write (s->fd, buf, size); } -static int exec_close (FdMigrationState *s,bool flush) +static int exec_close (MigrationState *s,bool flush) {int ret =0 ;DPRINTF ("exec_close\n" );
@@ -61,14 +61,14 @@ static int exec_close(FdMigrationState *s, bool flush)return ret; } -FdMigrationState *exec_start_outgoing_migration (Monitor *mon, +MigrationState *exec_start_outgoing_migration (Monitor *mon,const char *command,int64_t bandwidth_limit,int detach,int blk,int inc) { -FdMigrationState *s; +MigrationState *s;FILE *f; s =g_malloc0 (sizeof (*s));
migration-fd.c +5 -5
@@ -30,17 +30,17 @@ do { } while (0)#endif -static int fd_errno (FdMigrationState *s) +static int fd_errno (MigrationState *s) {return errno; } -static int fd_write (FdMigrationState *s,const void * buf,size_t size) +static int fd_write (MigrationState *s,const void * buf,size_t size) {return write (s->fd, buf, size); } -static int fd_close (FdMigrationState *s,bool flush) +static int fd_close (MigrationState *s,bool flush) {DPRINTF ("fd_close\n" );if (s->fd !=-1 ) {
@@ -50,14 +50,14 @@ static int fd_close(FdMigrationState *s, bool flush)return 0 ; } -FdMigrationState *fd_start_outgoing_migration (Monitor *mon, +MigrationState *fd_start_outgoing_migration (Monitor *mon,const char *fdname,int64_t bandwidth_limit,int detach,int blk,int inc) { -FdMigrationState *s; +MigrationState *s; s =g_malloc0 (sizeof (*s));
migration-tcp.c +6 -6
@@ -28,17 +28,17 @@ do { } while (0)#endif -static int socket_errno (FdMigrationState *s) +static int socket_errno (MigrationState *s) {return socket_error (); } -static int socket_write (FdMigrationState *s,const void * buf,size_t size) +static int socket_write (MigrationState *s,const void * buf,size_t size) {return send (s->fd, buf, size,0 ); } -static int tcp_close (FdMigrationState *s,bool flush) +static int tcp_close (MigrationState *s,bool flush) {DPRINTF ("tcp_close\n" );if (s->fd !=-1 ) {
@@ -51,7 +51,7 @@ static int tcp_close(FdMigrationState *s, bool flush)static void tcp_wait_for_connect (void *opaque) { -FdMigrationState *s = opaque; +MigrationState *s = opaque;int val, ret;socklen_t valsize =sizeof (val);
@@ -75,7 +75,7 @@ static void tcp_wait_for_connect(void *opaque) } } -FdMigrationState *tcp_start_outgoing_migration(Monitor *mon, +MigrationState *tcp_start_outgoing_migration(Monitor *mon, const char *host_port, int64_t bandwidth_limit, int detach,
@@ -83,7 +83,7 @@ FdMigrationState *tcp_start_outgoing_migration(Monitor *mon, int inc) {struct sockaddr_in addr; -FdMigrationState *s; +MigrationState *s;int ret;if (parse_host_port (&addr, host_port) <0 )
migration-unix.c +6 -6
@@ -28,17 +28,17 @@ do { } while (0)#endif -static int unix_errno (FdMigrationState *s) +static int unix_errno (MigrationState *s) {return errno; } -static int unix_write (FdMigrationState *s,const void * buf,size_t size) +static int unix_write (MigrationState *s,const void * buf,size_t size) {return write (s->fd, buf, size); } -static int unix_close (FdMigrationState *s,bool flush) +static int unix_close (MigrationState *s,bool flush) {DPRINTF ("unix_close\n" );if (s->fd !=-1 ) {
@@ -50,7 +50,7 @@ static int unix_close(FdMigrationState *s, bool flush)static void unix_wait_for_connect (void *opaque) { -FdMigrationState *s = opaque; +MigrationState *s = opaque;int val, ret;socklen_t valsize =sizeof (val);
@@ -74,14 +74,14 @@ static void unix_wait_for_connect(void *opaque) } } -FdMigrationState *unix_start_outgoing_migration (Monitor *mon, +MigrationState *unix_start_outgoing_migration (Monitor *mon,const char *path,int64_t bandwidth_limit,int detach,int blk,int inc) { -FdMigrationState *s; +MigrationState *s;struct sockaddr_un addr;int ret;
migration.c +17 -17
@@ -34,7 +34,7 @@/* Migration speed throttling */ static int64_t max_throttle = (32 <<20 ); -static FdMigrationState *current_migration; +static MigrationState *current_migration;static NotifierList migration_state_notifiers =NOTIFIER_LIST_INITIALIZER (migration_state_notifiers);
@@ -78,7 +78,7 @@ void process_incoming_migration(QEMUFile *f)int do_migrate (Monitor *mon,const QDict *qdict,QObject **ret_data) { -FdMigrationState *s =NULL ; +MigrationState *s =NULL ;const char *p;int detach =qdict_get_try_bool (qdict,"detach" ,0 );int blk =qdict_get_try_bool (qdict,"blk" ,0 );
@@ -130,7 +130,7 @@ int do_migrate(Monitor *mon, const QDict *qdict, QObject **ret_data)int do_migrate_cancel (Monitor *mon,const QDict *qdict,QObject **ret_data) { -FdMigrationState *s = current_migration; +MigrationState *s = current_migration;if (s && s->get_status (s) ==MIG_STATE_ACTIVE ) { s->cancel (s);
@@ -141,7 +141,7 @@ int do_migrate_cancel(Monitor *mon, const QDict *qdict, QObject **ret_data)int do_migrate_set_speed (Monitor *mon,const QDict *qdict,QObject **ret_data) {int64_t d; -FdMigrationState *s; +MigrationState *s; d =qdict_get_int (qdict,"value" );if (d <0 ) {
@@ -229,7 +229,7 @@ void do_info_migrate(Monitor *mon, QObject **ret_data)QDict *qdict;if (current_migration) { -FdMigrationState *s = current_migration; +MigrationState *s = current_migration;switch (s->get_status (current_migration)) {case MIG_STATE_ACTIVE :
@@ -262,7 +262,7 @@ void do_info_migrate(Monitor *mon, QObject **ret_data)/* shared migration helpers */ -void migrate_fd_monitor_suspend (FdMigrationState *s,Monitor *mon) +void migrate_fd_monitor_suspend (MigrationState *s,Monitor *mon) { s->mon = mon;if (monitor_suspend (mon) ==0 ) {
@@ -273,7 +273,7 @@ void migrate_fd_monitor_suspend(FdMigrationState *s, Monitor *mon) } } -void migrate_fd_error (FdMigrationState *s) +void migrate_fd_error (MigrationState *s) {DPRINTF ("setting error state\n" ); s->state =MIG_STATE_ERROR ;
@@ -281,7 +281,7 @@ void migrate_fd_error(FdMigrationState *s)migrate_fd_cleanup (s); } -int migrate_fd_cleanup (FdMigrationState *s) +int migrate_fd_cleanup (MigrationState *s) {int ret =0 ;
@@ -309,7 +309,7 @@ int migrate_fd_cleanup(FdMigrationState *s)void migrate_fd_put_notify (void *opaque) { -FdMigrationState *s = opaque; +MigrationState *s = opaque;qemu_set_fd_handler2 (s->fd,NULL ,NULL ,NULL ,NULL );qemu_file_put_notify (s->file);
@@ -320,7 +320,7 @@ void migrate_fd_put_notify(void *opaque)ssize_t migrate_fd_put_buffer (void *opaque,const void *data,size_t size) { -FdMigrationState *s = opaque; +MigrationState *s = opaque;ssize_t ret; do {
@@ -337,7 +337,7 @@ ssize_t migrate_fd_put_buffer(void *opaque, const void *data, size_t size)return ret; } -void migrate_fd_connect (FdMigrationState *s) +void migrate_fd_connect (MigrationState *s) {int ret;
@@ -361,7 +361,7 @@ void migrate_fd_connect(FdMigrationState *s)void migrate_fd_put_ready (void *opaque) { -FdMigrationState *s = opaque; +MigrationState *s = opaque;int ret;if (s->state !=MIG_STATE_ACTIVE ) {
@@ -398,12 +398,12 @@ void migrate_fd_put_ready(void *opaque) } } -int migrate_fd_get_status (FdMigrationState *s) +int migrate_fd_get_status (MigrationState *s) {return s->state; } -void migrate_fd_cancel (FdMigrationState *s) +void migrate_fd_cancel (MigrationState *s) {if (s->state !=MIG_STATE_ACTIVE )return ;
@@ -417,7 +417,7 @@ void migrate_fd_cancel(FdMigrationState *s)migrate_fd_cleanup (s); } -void migrate_fd_release (FdMigrationState *s) +void migrate_fd_release (MigrationState *s) {DPRINTF ("releasing state\n" );
@@ -432,7 +432,7 @@ void migrate_fd_release(FdMigrationState *s)void migrate_fd_wait_for_unfreeze (void *opaque) { -FdMigrationState *s = opaque; +MigrationState *s = opaque;int ret;DPRINTF ("wait for unfreeze\n" );
@@ -451,7 +451,7 @@ void migrate_fd_wait_for_unfreeze(void *opaque)int migrate_fd_close (void *opaque,bool flush) { -FdMigrationState *s = opaque; +MigrationState *s = opaque;if (s->mon) {monitor_resume (s->mon);
migration.h +19 -19
@@ -23,21 +23,21 @@#define MIG_STATE_CANCELLED 1#define MIG_STATE_ACTIVE 2 -typedef struct FdMigrationState FdMigrationState ; +typedef struct MigrationState MigrationState ; -struct FdMigrationState +struct MigrationState {int64_t bandwidth_limit;QEMUFile *file;int fd;Monitor *mon;int state; -int (*get_error)(struct FdMigrationState *); -int (*close)(struct FdMigrationState *,bool flush); -int (*write)(struct FdMigrationState *,const void *,size_t ); -void (*cancel)(FdMigrationState *s); -int (*get_status)(FdMigrationState *s); -void (*release)(FdMigrationState *s); +int (*get_error)(MigrationState *s); +int (*close)(MigrationState *s,bool flush); +int (*write)(MigrationState *s,const void *buff,size_t size); +void (*cancel)(MigrationState *s); +int (*get_status)(MigrationState *s); +void (*release)(MigrationState *s);void *opaque;int blk;int shared;
@@ -64,7 +64,7 @@ void do_info_migrate(Monitor *mon, QObject **ret_data);int exec_start_incoming_migration (const char *host_port); -FdMigrationState *exec_start_outgoing_migration(Monitor *mon, +MigrationState *exec_start_outgoing_migration(Monitor *mon, const char *host_port, int64_t bandwidth_limit, int detach,
@@ -73,7 +73,7 @@ FdMigrationState *exec_start_outgoing_migration(Monitor *mon,int tcp_start_incoming_migration (const char *host_port); -FdMigrationState *tcp_start_outgoing_migration(Monitor *mon, +MigrationState *tcp_start_outgoing_migration(Monitor *mon, const char *host_port, int64_t bandwidth_limit, int detach,
@@ -82,7 +82,7 @@ FdMigrationState *tcp_start_outgoing_migration(Monitor *mon,int unix_start_incoming_migration (const char *path); -FdMigrationState *unix_start_outgoing_migration(Monitor *mon, +MigrationState *unix_start_outgoing_migration(Monitor *mon, const char *path, int64_t bandwidth_limit, int detach,
@@ -91,32 +91,32 @@ FdMigrationState *unix_start_outgoing_migration(Monitor *mon,int fd_start_incoming_migration (const char *path); -FdMigrationState *fd_start_outgoing_migration (Monitor *mon, +MigrationState *fd_start_outgoing_migration (Monitor *mon,const char *fdname,int64_t bandwidth_limit,int detach,int blk,int inc); -void migrate_fd_monitor_suspend (FdMigrationState *s,Monitor *mon); +void migrate_fd_monitor_suspend (MigrationState *s,Monitor *mon); -void migrate_fd_error (FdMigrationState *s); +void migrate_fd_error (MigrationState *s); -int migrate_fd_cleanup (FdMigrationState *s); +int migrate_fd_cleanup (MigrationState *s);void migrate_fd_put_notify (void *opaque);ssize_t migrate_fd_put_buffer (void *opaque,const void *data,size_t size); -void migrate_fd_connect (FdMigrationState *s); +void migrate_fd_connect (MigrationState *s);void migrate_fd_put_ready (void *opaque); -int migrate_fd_get_status (FdMigrationState *mig_state); +int migrate_fd_get_status (MigrationState *mig_state); -void migrate_fd_cancel (FdMigrationState *mig_state); +void migrate_fd_cancel (MigrationState *mig_state); -void migrate_fd_release (FdMigrationState *mig_state); +void migrate_fd_release (MigrationState *mig_state);void migrate_fd_wait_for_unfreeze (void *opaque);
Signature · 1 line
1.7.6.2
PATCH v3 7/23 migration: move migrate_create_state to do_migrate
In reply to Juan QuintelaOnce there, remove all parameters that don't need to be passed to *start_outgoing_migration() functions
--- migration-exec.c | 19 +++++-------------- migration-fd.c | 22 ++++++---------------- migration-tcp.c | 22 +++++++--------------- migration-unix.c | 19 +++++-------------- migration.c | 34 +++++++++++++++++++++------------- migration.h | 31 ++++--------------------------- 6 files changed, 48 insertions(+), 99 deletions(-)
migration-exec.c +5 -14
@@ -61,22 +61,14 @@ static int exec_close(MigrationState *s, bool flush)return ret; } -MigrationState *exec_start_outgoing_migration (Monitor *mon, -const char *command, -int64_t bandwidth_limit, -int detach, -int blk, -int inc) +int exec_start_outgoing_migration (MigrationState *s,const char *command) { -MigrationState *s;FILE *f; - s =migrate_create_state (mon, bandwidth_limit, detach, blk, inc); - f =popen (command,"w" );if (f ==NULL ) {DPRINTF ("Unable to popen exec target\n" ); - goto err_after_alloc; + goto err_after_popen; } s->fd =fileno (f);
@@ -94,13 +86,12 @@ MigrationState *exec_start_outgoing_migration(Monitor *mon, s->write = file_write;migrate_fd_connect (s); -return s; +return 0 ; err_after_open:pclose (f); -err_after_alloc: -g_free (s); -return NULL ; +err_after_popen: +return -1 ; }static void exec_accept_incoming_migration (void *opaque)
migration-fd.c +6 -16
@@ -50,21 +50,12 @@ static int fd_close(MigrationState *s, bool flush)return 0 ; } -MigrationState *fd_start_outgoing_migration (Monitor *mon, -const char *fdname, -int64_t bandwidth_limit, -int detach, -int blk, -int inc) +int fd_start_outgoing_migration (MigrationState *s,const char *fdname) { -MigrationState *s; - - s =migrate_create_state (mon, bandwidth_limit, detach, blk, inc); - - s->fd =monitor_get_fd (mon, fdname); + s->fd =monitor_get_fd (s->mon, fdname);if (s->fd ==-1 ) {DPRINTF ("fd_migration: invalid file descriptor identifier\n" ); - goto err_after_alloc; + goto err_after_get_fd; }if (fcntl (s->fd,F_SETFL ,O_NONBLOCK ) ==-1 ) {
@@ -77,13 +68,12 @@ MigrationState *fd_start_outgoing_migration(Monitor *mon, s->close = fd_close;migrate_fd_connect (s); -return s; +return 0 ; err_after_open:close (s->fd); -err_after_alloc: -g_free (s); -return NULL ; +err_after_get_fd: +return -1 ; }static void fd_accept_incoming_migration (void *opaque)
migration-tcp.c +7 -15
@@ -75,30 +75,22 @@ static void tcp_wait_for_connect(void *opaque) } } -MigrationState *tcp_start_outgoing_migration (Monitor *mon, -const char *host_port, -int64_t bandwidth_limit, -int detach, -int blk, -int inc) +int tcp_start_outgoing_migration (MigrationState *s,const char *host_port) {struct sockaddr_in addr; -MigrationState *s;int ret; -if (parse_host_port (&addr, host_port) <0 ) -return NULL ; - - s =migrate_create_state (mon, bandwidth_limit, detach, blk, inc); - + ret =parse_host_port (&addr, host_port); +if (ret <0 ) { +return ret; + } s->get_error = socket_errno; s->write = socket_write; s->close = tcp_close; s->fd =qemu_socket (PF_INET ,SOCK_STREAM ,0 );if (s->fd ==-1 ) { -g_free (s); -return NULL ; +return -1 ; }socket_set_nonblock (s->fd);
@@ -118,7 +110,7 @@ MigrationState *tcp_start_outgoing_migration(Monitor *mon, }else if (ret >=0 )migrate_fd_connect (s); -return s; +return 0 ; }static void tcp_accept_incoming_migration (void *opaque)
migration-unix.c +5 -14
@@ -74,22 +74,14 @@ static void unix_wait_for_connect(void *opaque) } } -MigrationState *unix_start_outgoing_migration (Monitor *mon, -const char *path, -int64_t bandwidth_limit, -int detach, -int blk, -int inc) +int unix_start_outgoing_migration (MigrationState *s,const char *path) { -MigrationState *s;struct sockaddr_un addr;int ret; addr.sun_family =AF_UNIX ;snprintf (addr.sun_path,sizeof (addr.sun_path),"%s" , path); - s =migrate_create_state (mon, bandwidth_limit, detach, blk, inc); - s->get_error = unix_errno; s->write = unix_write; s->close = unix_close;
@@ -97,7 +89,7 @@ MigrationState *unix_start_outgoing_migration(Monitor *mon, s->fd =qemu_socket (PF_UNIX ,SOCK_STREAM ,0 );if (s->fd <0 ) {DPRINTF ("Unable to open socket" ); - goto err_after_alloc; + goto err_after_socket; }socket_set_nonblock (s->fd);
@@ -119,14 +111,13 @@ MigrationState *unix_start_outgoing_migration(Monitor *mon,if (ret >=0 )migrate_fd_connect (s); -return s; +return 0 ; err_after_open:close (s->fd); -err_after_alloc: -g_free (s); -return NULL ; +err_after_socket: +return -1 ; }static void unix_accept_incoming_migration (void *opaque)
migration.c +21 -13
@@ -76,6 +76,10 @@ void process_incoming_migration(QEMUFile *f)vm_start (); } +static MigrationState *migrate_create_state (Monitor *mon, +int64_t bandwidth_limit, +int detach,int blk,int inc); +int do_migrate (Monitor *mon,const QDict *qdict,QObject **ret_data) {MigrationState *s =NULL ;
@@ -84,6 +88,7 @@ int do_migrate(Monitor *mon, const QDict *qdict, QObject **ret_data)int blk =qdict_get_try_bool (qdict,"blk" ,0 );int inc =qdict_get_try_bool (qdict,"inc" ,0 );const char *uri =qdict_get_str (qdict,"uri" ); +int ret;if (current_migration && current_migration->get_status (current_migration) ==MIG_STATE_ACTIVE ) {
@@ -95,28 +100,27 @@ int do_migrate(Monitor *mon, const QDict *qdict, QObject **ret_data)return -1 ; } + s =migrate_create_state (mon, max_throttle, detach, blk, inc); +if (strstart (uri,"tcp:" , &p)) { - s =tcp_start_outgoing_migration (mon, p, max_throttle, detach, - blk, inc); + ret =tcp_start_outgoing_migration (s, p);#if !defined(WIN32 ) } else if (strstart(uri, "exec:", &p)) { - s =exec_start_outgoing_migration (mon, p, max_throttle, detach, - blk, inc); + ret =exec_start_outgoing_migration (s, p); }else if (strstart (uri,"unix:" , &p)) { - s =unix_start_outgoing_migration (mon, p, max_throttle, detach, - blk, inc); + ret =unix_start_outgoing_migration (s, p); }else if (strstart (uri,"fd:" , &p)) { - s =fd_start_outgoing_migration (mon, p, max_throttle, detach, - blk, inc); + ret =fd_start_outgoing_migration (s, p);#endif }else {monitor_printf (mon,"unknown migration protocol: %s\n" , uri); -return -1 ; + ret = -EINVAL ; + goto free_migrate_state; } -if (s ==NULL ) { +if (ret <0 ) {monitor_printf (mon,"migration failed\n" ); -return -1 ; + goto free_migrate_state; }if (current_migration) {
@@ -126,6 +130,9 @@ int do_migrate(Monitor *mon, const QDict *qdict, QObject **ret_data) current_migration = s;notifier_list_notify (&migration_state_notifiers,NULL );return 0 ; +free_migrate_state: +g_free (s); +return -1 ; }int do_migrate_cancel (Monitor *mon,const QDict *qdict,QObject **ret_data)
@@ -479,8 +486,9 @@ void migrate_fd_connect(MigrationState *s)migrate_fd_put_ready (s); } -MigrationState *migrate_create_state (Monitor *mon,int64_t bandwidth_limit, -int detach,int blk,int inc) +static MigrationState *migrate_create_state (Monitor *mon, +int64_t bandwidth_limit, +int detach,int blk,int inc) {MigrationState *s =g_malloc0 (sizeof (*s));
migration.h +4 -27
@@ -64,47 +64,24 @@ void do_info_migrate(Monitor *mon, QObject **ret_data);int exec_start_incoming_migration (const char *host_port); -MigrationState *exec_start_outgoing_migration (Monitor *mon, -const char *host_port, -int64_t bandwidth_limit, -int detach, -int blk, -int inc); +int exec_start_outgoing_migration (MigrationState *s,const char *host_port);int tcp_start_incoming_migration (const char *host_port); -MigrationState *tcp_start_outgoing_migration (Monitor *mon, -const char *host_port, -int64_t bandwidth_limit, -int detach, -int blk, -int inc); +int tcp_start_outgoing_migration (MigrationState *s,const char *host_port);int unix_start_incoming_migration (const char *path); -MigrationState *unix_start_outgoing_migration (Monitor *mon, -const char *path, -int64_t bandwidth_limit, -int detach, -int blk, -int inc); +int unix_start_outgoing_migration (MigrationState *s,const char *path);int fd_start_incoming_migration (const char *path); -MigrationState *fd_start_outgoing_migration (Monitor *mon, -const char *fdname, -int64_t bandwidth_limit, -int detach, -int blk, -int inc); +int fd_start_outgoing_migration (MigrationState *s,const char *fdname);void migrate_fd_error (MigrationState *s);void migrate_fd_connect (MigrationState *s); -MigrationState *migrate_create_state (Monitor *mon,int64_t bandwidth_limit, -int detach,int blk,int inc); -void add_migration_state_change_notifier (Notifier *notify);void remove_migration_state_change_notifier (Notifier *notify);int get_migration_state (void );
Signature · 1 line
1.7.6.2
PATCH v3 11/23 migration: Our release callback was just free
In reply to Juan QuintelaWe called it from a single place, and always with state != MIG_STATE_ACTIVE. Just remove the whole callback. For users of the notifier, notice that this is exactly the case where they don't care, we are just freeing the state from previous failed migration (it can't be a sucessful one, otherwise we would not be running on that machine in the first place).
--- migration.c | 19 +------------------ migration.h | 1 - 2 files changed, 1 insertions(+), 19 deletions(-)
migration.c +1 -18
@@ -123,10 +123,7 @@ int do_migrate(Monitor *mon, const QDict *qdict, QObject **ret_data) goto free_migrate_state; } -if (current_migration) { - current_migration->release (current_migration); - } - +g_free (current_migration); current_migration = s;notifier_list_notify (&migration_state_notifiers,NULL );return 0 ;
@@ -411,19 +408,6 @@ static void migrate_fd_cancel(MigrationState *s)migrate_fd_cleanup (s); } -static void migrate_fd_release (MigrationState *s) -{ - -DPRINTF ("releasing state\n" ); - -if (s->state ==MIG_STATE_ACTIVE ) { - s->state =MIG_STATE_CANCELLED ; -notifier_list_notify (&migration_state_notifiers,NULL ); -migrate_fd_cleanup (s); - } -g_free (s); -} -static void migrate_fd_wait_for_unfreeze (void *opaque) {MigrationState *s = opaque;
@@ -503,7 +487,6 @@ static MigrationState *migrate_create_state(Monitor *mon, s->cancel = migrate_fd_cancel; s->get_status = migrate_fd_get_status; - s->release = migrate_fd_release; s->blk = blk; s->shared = inc; s->mon =NULL ;
migration.h +0 -1
@@ -40,7 +40,6 @@ struct MigrationStateint (*write)(MigrationState *s,const void *buff,size_t size);void (*cancel)(MigrationState *s);int (*get_status)(MigrationState *s); -void (*release)(MigrationState *s);void *opaque;int blk;int shared;
Signature · 1 line
1.7.6.2
PATCH v3 8/23 migration: Introduce MIG_STATE_NONE
In reply to Juan QuintelaUse MIG_STATE_ACTIVE only when migration has really started
--- migration.c | 6 +++++- migration.h | 11 +++++++---- 2 files changed, 12 insertions(+), 5 deletions(-)
migration.c +5 -1
@@ -239,6 +239,9 @@ void do_info_migrate(Monitor *mon, QObject **ret_data)MigrationState *s = current_migration;switch (s->get_status (current_migration)) { +case MIG_STATE_NONE : +/* no migration has happened ever */ +break ;case MIG_STATE_ACTIVE : qdict =qdict_new ();qdict_put (qdict,"status" ,qstring_from_str ("active" ));
@@ -469,6 +472,7 @@ void migrate_fd_connect(MigrationState *s) {int ret; + s->state =MIG_STATE_ACTIVE ; s->file = qemu_fopen_ops_buffered(s, s->bandwidth_limit, migrate_fd_put_buffer,
@@ -499,7 +503,7 @@ static MigrationState *migrate_create_state(Monitor *mon, s->shared = inc; s->mon =NULL ; s->bandwidth_limit = bandwidth_limit; - s->state =MIG_STATE_ACTIVE ; + s->state =MIG_STATE_NONE ;if (!detach) {migrate_fd_monitor_suspend (s, mon);
migration.h +7 -4
@@ -18,10 +18,13 @@#include "qemu-common.h" #include "notify.h" -#define MIG_STATE_ERROR -1 -#define MIG_STATE_COMPLETED 0 -#define MIG_STATE_CANCELLED 1 -#define MIG_STATE_ACTIVE 2 +enum migration_state { +MIG_STATE_ERROR , +MIG_STATE_NONE , +MIG_STATE_CANCELLED , +MIG_STATE_ACTIVE , +MIG_STATE_COMPLETED , +};typedef struct MigrationState MigrationState ;
Signature · 1 line
1.7.6.2
PATCH v3 9/23 migration: Refactor and simplify error checking in migrate_fd_put_ready
In reply to Juan Quintela--- migration.c | 19 +++++++++---------- 1 files changed, 9 insertions(+), 10 deletions(-)
migration.c +9 -10
@@ -368,22 +368,21 @@ static void migrate_fd_put_ready(void *opaque)DPRINTF ("done iterating\n" );vm_stop (VMSTOP_MIGRATE ); -if ((qemu_savevm_state_complete (s->mon, s->file)) <0 ) { -if (old_vm_running) { -vm_start (); +if (qemu_savevm_state_complete (s->mon, s->file) <0 ) { +migrate_fd_error (s); + }else { +if (migrate_fd_cleanup (s) <0 ) { +migrate_fd_error (s); + }else { + s->state =MIG_STATE_COMPLETED ; +notifier_list_notify (&migration_state_notifiers,NULL ); } - s->state =MIG_STATE_ERROR ; } -if (migrate_fd_cleanup (s) <0 ) { +if (s->get_status (s) !=MIG_STATE_COMPLETED ) {if (old_vm_running) {vm_start (); } - s->state =MIG_STATE_ERROR ; } -if (s->state ==MIG_STATE_ACTIVE ) { - s->state =MIG_STATE_COMPLETED ; - } -notifier_list_notify (&migration_state_notifiers,NULL ); } }
Signature · 1 line
1.7.6.2
PATCH v3 13/23 migration: Remove migration cancel() callback
In reply to Juan QuintelaIt is used only in one place
--- migration.c | 9 ++++----- migration.h | 1 - 2 files changed, 4 insertions(+), 6 deletions(-)
migration.c +4 -5
@@ -132,12 +132,12 @@ free_migrate_state:return -1 ; } +static void migrate_fd_cancel (MigrationState *s); +int do_migrate_cancel (Monitor *mon,const QDict *qdict,QObject **ret_data) { -MigrationState *s = current_migration; - -if (s && s->state ==MIG_STATE_ACTIVE ) { - s->cancel (s); +if (current_migration) { +migrate_fd_cancel (current_migration); }return 0 ; }
@@ -480,7 +480,6 @@ static MigrationState *migrate_create_state(Monitor *mon, {MigrationState *s =g_malloc0 (sizeof (*s)); - s->cancel = migrate_fd_cancel; s->blk = blk; s->shared = inc; s->mon =NULL ;
migration.h +0 -1
@@ -38,7 +38,6 @@ struct MigrationStateint (*get_error)(MigrationState *s);int (*close)(MigrationState *s,bool flush);int (*write)(MigrationState *s,const void *buff,size_t size); -void (*cancel)(MigrationState *s);void *opaque;int blk;int shared;
Signature · 1 line
1.7.6.2
PATCH v3 12/23 migration: Remove get_status() accessor
In reply to Juan QuintelaIt is only used inside migration.c, and fields on that struct are accessed all around the place on that file.
--- migration.c | 16 +++++----------- migration.h | 1 - 2 files changed, 5 insertions(+), 12 deletions(-)
migration.c +5 -11
@@ -91,7 +91,7 @@ int do_migrate(Monitor *mon, const QDict *qdict, QObject **ret_data)int ret;if (current_migration && - current_migration->get_status (current_migration) ==MIG_STATE_ACTIVE ) { + current_migration->state ==MIG_STATE_ACTIVE ) {monitor_printf (mon,"migration already in progress\n" );return -1 ; }
@@ -136,7 +136,7 @@ int do_migrate_cancel(Monitor *mon, const QDict *qdict, QObject **ret_data) {MigrationState *s = current_migration; -if (s && s->get_status (s) ==MIG_STATE_ACTIVE ) { +if (s && s->state ==MIG_STATE_ACTIVE ) { s->cancel (s); }return 0 ;
@@ -235,7 +235,7 @@ void do_info_migrate(Monitor *mon, QObject **ret_data)if (current_migration) {MigrationState *s = current_migration; -switch (s->get_status (current_migration)) { +switch (s->state) {case MIG_STATE_NONE :/* no migration has happened ever */ break ;
@@ -381,7 +381,7 @@ static void migrate_fd_put_ready(void *opaque) }else {migrate_fd_completed (s); } -if (s->get_status (s) !=MIG_STATE_COMPLETED ) { +if (s->state !=MIG_STATE_COMPLETED ) {if (old_vm_running) {vm_start (); }
@@ -389,11 +389,6 @@ static void migrate_fd_put_ready(void *opaque) } } -static int migrate_fd_get_status (MigrationState *s) -{ -return s->state; -} -static void migrate_fd_cancel (MigrationState *s) {if (s->state !=MIG_STATE_ACTIVE )
@@ -451,7 +446,7 @@ void remove_migration_state_change_notifier(Notifier *notify)int get_migration_state (void ) {if (current_migration) { -return migrate_fd_get_status (current_migration); +return current_migration->state; }else {return MIG_STATE_ERROR ; }
@@ -486,7 +481,6 @@ static MigrationState *migrate_create_state(Monitor *mon,MigrationState *s =g_malloc0 (sizeof (*s)); s->cancel = migrate_fd_cancel; - s->get_status = migrate_fd_get_status; s->blk = blk; s->shared = inc; s->mon =NULL ;
migration.h +0 -1
@@ -39,7 +39,6 @@ struct MigrationStateint (*close)(MigrationState *s,bool flush);int (*write)(MigrationState *s,const void *buff,size_t size);void (*cancel)(MigrationState *s); -int (*get_status)(MigrationState *s);void *opaque;int blk;int shared;
Signature · 1 line
1.7.6.2
PATCH v3 15/23 migration: use global variable directly
In reply to Juan QuintelaWe are setting a pointer to a local variable in the previous line, just use the global variable directly. We remove the ->file test because it is already done inside qemu_file_set_rate_limit() function.
--- migration.c | 6 ++---- 1 files changed, 2 insertions(+), 4 deletions(-)
migration.c +2 -4
@@ -459,7 +459,6 @@ int do_migrate_cancel(Monitor *mon, const QDict *qdict, QObject **ret_data)int do_migrate_set_speed (Monitor *mon,const QDict *qdict,QObject **ret_data) {int64_t d; -MigrationState *s; d =qdict_get_int (qdict,"value" );if (d <0 ) {
@@ -467,9 +466,8 @@ int do_migrate_set_speed(Monitor *mon, const QDict *qdict, QObject **ret_data) } max_throttle = d; - s = current_migration; -if (s && s->file) { -qemu_file_set_rate_limit (s->file, max_throttle); +if (current_migration) { +qemu_file_set_rate_limit (current_migration->file, max_throttle); }return 0 ;
Signature · 1 line
1.7.6.2
PATCH v3 6/23 migration: Make all posible migration functions static
In reply to Juan QuintelaI have to move two functions postions to avoid forward declarations
--- migration.c | 72 +++++++++++++++++++++++++++++----------------------------- migration.h | 12 --------- 2 files changed, 36 insertions(+), 48 deletions(-)
migration.c +36 -36
@@ -273,15 +273,7 @@ static void migrate_fd_monitor_suspend(MigrationState *s, Monitor *mon) } } -void migrate_fd_error (MigrationState *s) -{ -DPRINTF ("setting error state\n" ); - s->state =MIG_STATE_ERROR ; -notifier_list_notify (&migration_state_notifiers,NULL ); -migrate_fd_cleanup (s); -} - -int migrate_fd_cleanup (MigrationState *s) +static int migrate_fd_cleanup (MigrationState *s) {int ret =0 ;
@@ -307,7 +299,15 @@ int migrate_fd_cleanup(MigrationState *s)return ret; } -void migrate_fd_put_notify (void *opaque) +void migrate_fd_error (MigrationState *s) +{ +DPRINTF ("setting error state\n" ); + s->state =MIG_STATE_ERROR ; +notifier_list_notify (&migration_state_notifiers,NULL ); +migrate_fd_cleanup (s); +} + +static void migrate_fd_put_notify (void *opaque) {MigrationState *s = opaque;
@@ -318,7 +318,8 @@ void migrate_fd_put_notify(void *opaque) } } -ssize_t migrate_fd_put_buffer (void *opaque,const void *data,size_t size) +static ssize_t migrate_fd_put_buffer (void *opaque,const void *data, +size_t size) {MigrationState *s = opaque;ssize_t ret;
@@ -337,29 +338,7 @@ ssize_t migrate_fd_put_buffer(void *opaque, const void *data, size_t size)return ret; } -void migrate_fd_connect (MigrationState *s) -{ -int ret; - - s->file =qemu_fopen_ops_buffered (s, - s->bandwidth_limit, - migrate_fd_put_buffer, - migrate_fd_put_ready, - migrate_fd_wait_for_unfreeze, - migrate_fd_close); - -DPRINTF ("beginning savevm\n" ); - ret =qemu_savevm_state_begin (s->mon, s->file, s->blk, s->shared); -if (ret <0 ) { -DPRINTF ("failed, %d\n" , ret); -migrate_fd_error (s); -return ; - } - -migrate_fd_put_ready (s); -} - -void migrate_fd_put_ready (void *opaque) +static void migrate_fd_put_ready (void *opaque) {MigrationState *s = opaque;int ret;
@@ -430,7 +409,7 @@ static void migrate_fd_release(MigrationState *s)g_free (s); } -void migrate_fd_wait_for_unfreeze (void *opaque) +static void migrate_fd_wait_for_unfreeze (void *opaque) {MigrationState *s = opaque;int ret;
@@ -449,7 +428,7 @@ void migrate_fd_wait_for_unfreeze(void *opaque) }while (ret ==-1 && (s->get_error (s)) ==EINTR ); } -int migrate_fd_close (void *opaque,bool flush) +static int migrate_fd_close (void *opaque,bool flush) {MigrationState *s = opaque;
@@ -479,6 +458,27 @@ int get_migration_state(void) } } +void migrate_fd_connect (MigrationState *s) +{ +int ret; + + s->file =qemu_fopen_ops_buffered (s, + s->bandwidth_limit, + migrate_fd_put_buffer, + migrate_fd_put_ready, + migrate_fd_wait_for_unfreeze, + migrate_fd_close); + +DPRINTF ("beginning savevm\n" ); + ret =qemu_savevm_state_begin (s->mon, s->file, s->blk, s->shared); +if (ret <0 ) { +DPRINTF ("failed, %d\n" , ret); +migrate_fd_error (s); +return ; + } +migrate_fd_put_ready (s); +} +MigrationState *migrate_create_state (Monitor *mon,int64_t bandwidth_limit,int detach,int blk,int inc) {
migration.h +0 -12
@@ -100,20 +100,8 @@ MigrationState *fd_start_outgoing_migration(Monitor *mon,void migrate_fd_error (MigrationState *s); -int migrate_fd_cleanup (MigrationState *s); - -void migrate_fd_put_notify (void *opaque); - -ssize_t migrate_fd_put_buffer (void *opaque,const void *data,size_t size); -void migrate_fd_connect (MigrationState *s); -void migrate_fd_put_ready (void *opaque); - -void migrate_fd_wait_for_unfreeze (void *opaque); - -int migrate_fd_close (void *opaque,bool flush); -MigrationState *migrate_create_state (Monitor *mon,int64_t bandwidth_limit,int detach,int blk,int inc);
Signature · 1 line
1.7.6.2
PATCH v3 14/23 migration: Move exported functions to the end of the file
In reply to Juan QuintelaThis means we can remove the two forward declarations.
--- migration.c | 188 ++++++++++++++++++++++++++++------------------------------ 1 files changed, 91 insertions(+), 97 deletions(-)
migration.c +91 -97
@@ -76,91 +76,6 @@ void process_incoming_migration(QEMUFile *f)vm_start (); } -static MigrationState *migrate_create_state (Monitor *mon, -int64_t bandwidth_limit, -int detach,int blk,int inc); - -int do_migrate (Monitor *mon,const QDict *qdict,QObject **ret_data) -{ -MigrationState *s =NULL ; -const char *p; -int detach =qdict_get_try_bool (qdict,"detach" ,0 ); -int blk =qdict_get_try_bool (qdict,"blk" ,0 ); -int inc =qdict_get_try_bool (qdict,"inc" ,0 ); -const char *uri =qdict_get_str (qdict,"uri" ); -int ret; - -if (current_migration && - current_migration->state ==MIG_STATE_ACTIVE ) { -monitor_printf (mon,"migration already in progress\n" ); -return -1 ; - } - -if (qemu_savevm_state_blocked (mon)) { -return -1 ; - } - - s =migrate_create_state (mon, max_throttle, detach, blk, inc); - -if (strstart (uri,"tcp:" , &p)) { - ret =tcp_start_outgoing_migration (s, p); -#if !defined(WIN32 ) - } else if (strstart(uri, "exec:", &p)) { - ret =exec_start_outgoing_migration (s, p); - }else if (strstart (uri,"unix:" , &p)) { - ret =unix_start_outgoing_migration (s, p); - }else if (strstart (uri,"fd:" , &p)) { - ret =fd_start_outgoing_migration (s, p); -#endif - }else { -monitor_printf (mon,"unknown migration protocol: %s\n" , uri); - ret = -EINVAL ; - goto free_migrate_state; - } - -if (ret <0 ) { -monitor_printf (mon,"migration failed\n" ); - goto free_migrate_state; - } - -g_free (current_migration); - current_migration = s; -notifier_list_notify (&migration_state_notifiers,NULL ); -return 0 ; -free_migrate_state: -g_free (s); -return -1 ; -} - -static void migrate_fd_cancel (MigrationState *s); - -int do_migrate_cancel (Monitor *mon,const QDict *qdict,QObject **ret_data) -{ -if (current_migration) { -migrate_fd_cancel (current_migration); - } -return 0 ; -} - -int do_migrate_set_speed (Monitor *mon,const QDict *qdict,QObject **ret_data) -{ -int64_t d; -MigrationState *s; - - d =qdict_get_int (qdict,"value" ); -if (d <0 ) { - d =0 ; - } - max_throttle = d; - - s = current_migration; -if (s && s->file) { -qemu_file_set_rate_limit (s->file, max_throttle); - } - -return 0 ; -} -/* amount of nanoseconds we are willing to wait for migration to be down. * the choice of nanoseconds is because it is the maximum resolution that * get_clock() can achieve. It is an internal measure. All user-visible
@@ -172,18 +87,6 @@ uint64_t migrate_max_downtime(void)return max_downtime; } -int do_migrate_set_downtime (Monitor *mon,const QDict *qdict, -QObject **ret_data) -{ -double d; - - d =qdict_get_double (qdict,"value" ) *1e9 ; - d =MAX (0 ,MIN (UINT64_MAX , d)); - max_downtime = (uint64_t )d; - -return 0 ; -} -static void migrate_print_status (Monitor *mon,const char *name,const QDict *status_dict) {
@@ -492,3 +395,94 @@ static MigrationState *migrate_create_state(Monitor *mon,return s; } + +int do_migrate (Monitor *mon,const QDict *qdict,QObject **ret_data) +{ +MigrationState *s =NULL ; +const char *p; +int detach =qdict_get_try_bool (qdict,"detach" ,0 ); +int blk =qdict_get_try_bool (qdict,"blk" ,0 ); +int inc =qdict_get_try_bool (qdict,"inc" ,0 ); +const char *uri =qdict_get_str (qdict,"uri" ); +int ret; + +if (current_migration && + current_migration->state ==MIG_STATE_ACTIVE ) { +monitor_printf (mon,"migration already in progress\n" ); +return -1 ; + } + +if (qemu_savevm_state_blocked (mon)) { +return -1 ; + } + + s =migrate_create_state (mon, max_throttle, detach, blk, inc); + +if (strstart (uri,"tcp:" , &p)) { + ret =tcp_start_outgoing_migration (s, p); +#if !defined(WIN32 ) + } else if (strstart(uri, "exec:", &p)) { + ret =exec_start_outgoing_migration (s, p); + }else if (strstart (uri,"unix:" , &p)) { + ret =unix_start_outgoing_migration (s, p); + }else if (strstart (uri,"fd:" , &p)) { + ret =fd_start_outgoing_migration (s, p); +#endif + }else { +monitor_printf (mon,"unknown migration protocol: %s\n" , uri); + ret = -EINVAL ; + goto free_migrate_state; + } + +if (ret <0 ) { +monitor_printf (mon,"migration failed\n" ); + goto free_migrate_state; + } + +g_free (current_migration); + current_migration = s; +notifier_list_notify (&migration_state_notifiers,NULL ); +return 0 ; +free_migrate_state: +g_free (s); +return -1 ; +} + +int do_migrate_cancel (Monitor *mon,const QDict *qdict,QObject **ret_data) +{ +if (current_migration) { +migrate_fd_cancel (current_migration); + } +return 0 ; +} + +int do_migrate_set_speed (Monitor *mon,const QDict *qdict,QObject **ret_data) +{ +int64_t d; +MigrationState *s; + + d =qdict_get_int (qdict,"value" ); +if (d <0 ) { + d =0 ; + } + max_throttle = d; + + s = current_migration; +if (s && s->file) { +qemu_file_set_rate_limit (s->file, max_throttle); + } + +return 0 ; +} + +int do_migrate_set_downtime (Monitor *mon,const QDict *qdict, +QObject **ret_data) +{ +double d; + + d =qdict_get_double (qdict,"value" ) *1e9 ; + d =MAX (0 ,MIN (UINT64_MAX , d)); + max_downtime = (uint64_t )d; + +return 0 ; +}
Signature · 1 line
1.7.6.2
PATCH v3 18/23 migration: Use bandwidth_limit directly
In reply to Juan QuintelaNow that current_migration is static, there is no reason for max_throotle variable.
--- migration.c | 15 +++++++-------- 1 files changed, 7 insertions(+), 8 deletions(-)
migration.c +7 -8
@@ -31,14 +31,14 @@ do { } while (0)#endif -/* Migration speed throttling */ -static int64_t max_throttle = (32 <<20 ); +#define MAX_THROTTLE (32 << 20)/* Migration speed throttling */ /* When we add fault tolerance, we could have several migrations at once. For now we don't need to add dynamic creation of migration */ static MigrationState current_migration_static = { .state =MIG_STATE_NONE , + .bandwidth_limit =MAX_THROTTLE , };static MigrationState *current_migration = ¤t_migration_static;
@@ -375,14 +375,12 @@ void migrate_fd_connect(MigrationState *s)migrate_fd_put_ready (s); } -static void migrate_init_state (Monitor *mon,int64_t bandwidth_limit, -int detach,int blk,int inc) +static void migrate_init_state (Monitor *mon,int detach,int blk,int inc) {memset (current_migration,0 ,sizeof (current_migration)); current_migration->blk = blk; current_migration->shared = inc; current_migration->mon =NULL ; - current_migration->bandwidth_limit = bandwidth_limit; current_migration->state =MIG_STATE_NONE ;if (!detach) {
@@ -408,7 +406,7 @@ int do_migrate(Monitor *mon, const QDict *qdict, QObject **ret_data)return -1 ; } -migrate_init_state (mon, max_throttle, detach, blk, inc); +migrate_init_state (mon, detach, blk, inc);if (strstart (uri,"tcp:" , &p)) { ret =tcp_start_outgoing_migration (current_migration, p);
@@ -448,9 +446,10 @@ int do_migrate_set_speed(Monitor *mon, const QDict *qdict, QObject **ret_data)if (d <0 ) { d =0 ; } - max_throttle = d; + current_migration->bandwidth_limit = d; -qemu_file_set_rate_limit (current_migration->file, max_throttle); +qemu_file_set_rate_limit (current_migration->file, + current_migration->bandwidth_limit);return 0 ; }
Signature · 1 line
1.7.6.2
PATCH v3 23/23 migration: make migration-{tcp, unix} consistent
In reply to Juan QuintelaFiles are almost identical in functionality, just remove the differences that make no sense.
--- migration-tcp.c | 15 ++++++++++----- migration-unix.c | 46 +++++++++++++++++++++++++--------------------- 2 files changed, 35 insertions(+), 26 deletions(-)
migration-tcp.c +10 -5
@@ -48,7 +48,6 @@ static int tcp_close(MigrationState *s, bool flush)return 0 ; } -static void tcp_wait_for_connect (void *opaque) {MigrationState *s = opaque;
@@ -84,12 +83,14 @@ int tcp_start_outgoing_migration(MigrationState *s, const char *host_port)if (ret <0 ) {return ret; } + s->get_error = socket_errno; s->write = socket_write; s->close = tcp_close; s->fd =qemu_socket (PF_INET ,SOCK_STREAM ,0 );if (s->fd ==-1 ) { +DPRINTF ("Unable to open socket" );return -socket_error (); }
@@ -155,23 +156,27 @@ int tcp_start_incoming_migration(const char *host_port)int val;int s; +DPRINTF ("Attempting to start an incoming migration\n" ); +if (parse_host_port (&addr, host_port) <0 ) {fprintf (stderr,"invalid host/port combination: %s\n" , host_port);return -EINVAL ; } s =qemu_socket (PF_INET ,SOCK_STREAM ,0 ); -if (s ==-1 ) +if (s ==-1 ) {return -socket_error (); + } val =1 ;setsockopt (s,SOL_SOCKET ,SO_REUSEADDR , (const char *)&val,sizeof (val)); -if (bind (s, (struct sockaddr *)&addr,sizeof (addr)) ==-1 ) +if (bind (s, (struct sockaddr *)&addr,sizeof (addr)) ==-1 ) { goto err; - -if (listen (s,1 ) ==-1 ) + } +if (listen (s,1 ) ==-1 ) { goto err; + }qemu_set_fd_handler2 (s,NULL , tcp_accept_incoming_migration,NULL , (void *)(intptr_t )s);
migration-unix.c +25 -21
84 lines not on this page · raw message
Signature · 1 line
1.7.6.2
PATCH v3 17/23 migration: make sure we always have a migration state
In reply to Juan QuintelaThis cleans up a lot the code as we don't have to check anymore if the variable is NULL or not.
We don't make it static, because when we integrate fault tolerance, we can have several migrations at once.
--- migration.c | 126 +++++++++++++++++++++++++--------------------------------- 1 files changed, 54 insertions(+), 72 deletions(-)
migration.c +54 -72
@@ -34,7 +34,13 @@/* Migration speed throttling */ static int64_t max_throttle = (32 <<20 ); -static MigrationState *current_migration; +/* When we add fault tolerance, we could have several +migrations at once. For now we don't need to add +dynamic creation of migration */ +static MigrationState current_migration_static = { + .state =MIG_STATE_NONE , +}; +static MigrationState *current_migration = ¤t_migration_static;static NotifierList migration_state_notifiers =NOTIFIER_LIST_INITIALIZER (migration_state_notifiers);
@@ -135,37 +141,34 @@ void do_info_migrate(Monitor *mon, QObject **ret_data) {QDict *qdict; -if (current_migration) { - -switch (current_migration->state) { -case MIG_STATE_NONE : -/* no migration has happened ever */ -break ; -case MIG_STATE_ACTIVE : - qdict =qdict_new (); -qdict_put (qdict,"status" ,qstring_from_str ("active" )); - -migrate_put_status (qdict,"ram" ,ram_bytes_transferred (), -ram_bytes_remaining (),ram_bytes_total ()); - -if (blk_mig_active ()) { -migrate_put_status (qdict,"disk" ,blk_mig_bytes_transferred (), -blk_mig_bytes_remaining (), -blk_mig_bytes_total ()); - } - - *ret_data =QOBJECT (qdict); -break ; -case MIG_STATE_COMPLETED : - *ret_data =qobject_from_jsonf ("{ 'status': 'completed' }" ); -break ; -case MIG_STATE_ERROR : - *ret_data =qobject_from_jsonf ("{ 'status': 'failed' }" ); -break ; -case MIG_STATE_CANCELLED : - *ret_data =qobject_from_jsonf ("{ 'status': 'cancelled' }" ); -break ; +switch (current_migration->state) { +case MIG_STATE_NONE : +/* no migration has happened ever */ +break ; +case MIG_STATE_ACTIVE : + qdict =qdict_new (); +qdict_put (qdict,"status" ,qstring_from_str ("active" )); + +migrate_put_status (qdict,"ram" ,ram_bytes_transferred (), +ram_bytes_remaining (),ram_bytes_total ()); + +if (blk_mig_active ()) { +migrate_put_status (qdict,"disk" ,blk_mig_bytes_transferred (), +blk_mig_bytes_remaining (), +blk_mig_bytes_total ()); } + + *ret_data =QOBJECT (qdict); +break ; +case MIG_STATE_COMPLETED : + *ret_data =qobject_from_jsonf ("{ 'status': 'completed' }" ); +break ; +case MIG_STATE_ERROR : + *ret_data =qobject_from_jsonf ("{ 'status': 'failed' }" ); +break ; +case MIG_STATE_CANCELLED : + *ret_data =qobject_from_jsonf ("{ 'status': 'cancelled' }" ); +break ; } }
@@ -347,11 +350,7 @@ void remove_migration_state_change_notifier(Notifier *notify)int get_migration_state (void ) { -if (current_migration) { -return current_migration->state; - }else { -return MIG_STATE_ERROR ; - } +return current_migration->state; }void migrate_fd_connect (MigrationState *s)
@@ -376,28 +375,23 @@ void migrate_fd_connect(MigrationState *s)migrate_fd_put_ready (s); } -static MigrationState *migrate_create_state (Monitor *mon, -int64_t bandwidth_limit, -int detach,int blk,int inc) +static void migrate_init_state (Monitor *mon,int64_t bandwidth_limit, +int detach,int blk,int inc) { -MigrationState *s =g_malloc0 (sizeof (*s)); - - s->blk = blk; - s->shared = inc; - s->mon =NULL ; - s->bandwidth_limit = bandwidth_limit; - s->state =MIG_STATE_NONE ; +memset (current_migration,0 ,sizeof (current_migration)); + current_migration->blk = blk; + current_migration->shared = inc; + current_migration->mon =NULL ; + current_migration->bandwidth_limit = bandwidth_limit; + current_migration->state =MIG_STATE_NONE ;if (!detach) { -migrate_fd_monitor_suspend (s, mon); +migrate_fd_monitor_suspend (current_migration, mon); } - -return s; }int do_migrate (Monitor *mon,const QDict *qdict,QObject **ret_data) { -MigrationState *s =NULL ;const char *p;int detach =qdict_get_try_bool (qdict,"detach" ,0 );int blk =qdict_get_try_bool (qdict,"blk" ,0 );
@@ -405,8 +399,7 @@ int do_migrate(Monitor *mon, const QDict *qdict, QObject **ret_data)const char *uri =qdict_get_str (qdict,"uri" );int ret; -if (current_migration && - current_migration->state ==MIG_STATE_ACTIVE ) { +if (current_migration->state ==MIG_STATE_ACTIVE ) {monitor_printf (mon,"migration already in progress\n" );return -1 ; }
@@ -415,43 +408,35 @@ int do_migrate(Monitor *mon, const QDict *qdict, QObject **ret_data)return -1 ; } - s =migrate_create_state (mon, max_throttle, detach, blk, inc); +migrate_init_state (mon, max_throttle, detach, blk, inc);if (strstart (uri,"tcp:" , &p)) { - ret =tcp_start_outgoing_migration (s, p); + ret =tcp_start_outgoing_migration (current_migration, p);#if !defined(WIN32 ) } else if (strstart(uri, "exec:", &p)) { - ret =exec_start_outgoing_migration (s, p); + ret =exec_start_outgoing_migration (current_migration, p); }else if (strstart (uri,"unix:" , &p)) { - ret =unix_start_outgoing_migration (s, p); + ret =unix_start_outgoing_migration (current_migration, p); }else if (strstart (uri,"fd:" , &p)) { - ret =fd_start_outgoing_migration (s, p); + ret =fd_start_outgoing_migration (current_migration, p);#endif }else {monitor_printf (mon,"unknown migration protocol: %s\n" , uri); - ret = -EINVAL ; - goto free_migrate_state; +return -EINVAL ; }if (ret <0 ) {monitor_printf (mon,"migration failed\n" ); - goto free_migrate_state; +return ret; } -g_free (current_migration); - current_migration = s;notifier_list_notify (&migration_state_notifiers,NULL );return 0 ; -free_migrate_state: -g_free (s); -return -1 ; }int do_migrate_cancel (Monitor *mon,const QDict *qdict,QObject **ret_data) { -if (current_migration) { -migrate_fd_cancel (current_migration); - } +migrate_fd_cancel (current_migration);return 0 ; }
@@ -465,10 +450,7 @@ int do_migrate_set_speed(Monitor *mon, const QDict *qdict, QObject **ret_data) } max_throttle = d; -if (current_migration) { -qemu_file_set_rate_limit (current_migration->file, max_throttle); - } - +qemu_file_set_rate_limit (current_migration->file, max_throttle);return 0 ; }
Signature · 1 line
1.7.6.2
PATCH v3 21/23 migration: Don't use callback on file defining it
In reply to Juan Quintela--- migration-tcp.c | 4 ++-- migration-unix.c | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-)
migration-tcp.c +2 -2
@@ -58,7 +58,7 @@ static void tcp_wait_for_connect(void *opaque)DPRINTF ("connect completed\n" );do { ret =getsockopt (s->fd,SOL_SOCKET ,SO_ERROR , (void *) &val, &valsize); - }while (ret ==-1 && (s->get_error (s)) ==EINTR ); + }while (ret ==-1 && (socket_error ()) ==EINTR );if (ret <0 ) {migrate_fd_error (s);
@@ -98,7 +98,7 @@ int tcp_start_outgoing_migration(MigrationState *s, const char *host_port) do { ret = connect(s->fd, (struct sockaddr *)&addr, sizeof(addr)); if (ret == -1) - ret = -(s->get_error(s)); + ret = -(socket_error()); if (ret == -EINPROGRESS || ret == -EWOULDBLOCK) qemu_set_fd_handler2(s->fd, NULL, NULL, tcp_wait_for_connect, s);
migration-unix.c +3 -3
@@ -57,7 +57,7 @@ static void unix_wait_for_connect(void *opaque)DPRINTF ("connect completed\n" );do { ret =getsockopt (s->fd,SOL_SOCKET ,SO_ERROR , (void *) &val, &valsize); - }while (ret ==-1 && (s->get_error (s)) ==EINTR ); + }while (ret ==-1 && errno ==EINTR );if (ret <0 ) {migrate_fd_error (s);
@@ -97,7 +97,7 @@ int unix_start_outgoing_migration(MigrationState *s, const char *path) do { ret = connect(s->fd, (struct sockaddr *)&addr, sizeof(addr)); if (ret == -1) - ret = -(s->get_error(s)); + ret = -errno; if (ret == -EINPROGRESS || ret == -EWOULDBLOCK) qemu_set_fd_handler2(s->fd, NULL, NULL, unix_wait_for_connect, s);
@@ -130,7 +130,7 @@ static void unix_accept_incoming_migration(void *opaque)do { c =qemu_accept (s, (struct sockaddr *)&addr, &addrlen); - }while (c ==-1 &&socket_error () ==EINTR ); + }while (c ==-1 && errno ==EINTR );DPRINTF ("accepted migration\n" );
Signature · 1 line
1.7.6.2
PATCH v3 19/23 migration: Export a function that tells if the migration has finished correctly
In reply to Juan QuintelaThis will allows us to hide the status values.
--- migration.c | 4 ++-- migration.h | 2 +- ui/spice-core.c | 4 +--- 3 files changed, 4 insertions(+), 6 deletions(-)
migration.c +2 -2
@@ -348,9 +348,9 @@ void remove_migration_state_change_notifier(Notifier *notify)notifier_list_remove (&migration_state_notifiers, notify); } -int get_migration_state (void ) +bool migration_has_finished (void ) { -return current_migration->state; +return current_migration->state ==MIG_STATE_COMPLETED ; }void migrate_fd_connect (MigrationState *s)
migration.h +1 -1
@@ -84,7 +84,7 @@ void migrate_fd_connect(MigrationState *s);void add_migration_state_change_notifier (Notifier *notify);void remove_migration_state_change_notifier (Notifier *notify); -int get_migration_state (void ); +bool migration_has_finished (void );uint64_t ram_bytes_remaining (void );uint64_t ram_bytes_transferred (void );
ui/spice-core.c +1 -3
@@ -447,9 +447,7 @@ void do_info_spice(Monitor *mon, QObject **ret_data)static void migration_state_notifier (Notifier *notifier,void *data) { -int state =get_migration_state (); - -if (state ==MIG_STATE_COMPLETED ) { +if (migration_has_finished ()) {#if SPICE_SERVER_VERSION >=0x000701 /* 0.7.1 */ spice_server_migrate_switch (spice_server);#endif
Signature · 1 line
1.7.6.2
PATCH v3 20/23 migration: Make state definitions local
In reply to Juan Quintela--- migration.c | 8 ++++++++ migration.h | 8 -------- 2 files changed, 8 insertions(+), 8 deletions(-)
migration.c +8 -0
@@ -31,6 +31,14 @@ do { } while (0)#endif +enum migration_state { +MIG_STATE_ERROR , +MIG_STATE_NONE , +MIG_STATE_CANCELLED , +MIG_STATE_ACTIVE , +MIG_STATE_COMPLETED , +}; +#define MAX_THROTTLE (32 << 20)/* Migration speed throttling */ /* When we add fault tolerance, we could have several
migration.h +0 -8
@@ -18,14 +18,6 @@#include "qemu-common.h" #include "notify.h" -enum migration_state { -MIG_STATE_ERROR , -MIG_STATE_NONE , -MIG_STATE_CANCELLED , -MIG_STATE_ACTIVE , -MIG_STATE_COMPLETED , -}; -typedef struct MigrationState MigrationState ;struct MigrationState
Signature · 1 line
1.7.6.2
PATCH v3 16/23 migration: another case of global variable assigned to local one
In reply to Juan Quintela--- migration.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-)
migration.c +1 -2
@@ -136,9 +136,8 @@ void do_info_migrate(Monitor *mon, QObject **ret_data)QDict *qdict;if (current_migration) { -MigrationState *s = current_migration; -switch (s->state) { +switch (current_migration->state) {case MIG_STATE_NONE :/* no migration has happened ever */ break ;
Signature · 1 line
1.7.6.2
PATCH v3 22/23 migration: propagate error correctly
In reply to Juan Quintelaunix and tcp outgoing migration have error values, but didn't returned it. Make them return the error. Notice that EINPROGRESS & EWOULDBLOCK are not considered errors as callwill be retry later.
--- migration-tcp.c | 20 +++++++++++--------- migration-unix.c | 26 ++++++++++---------------- 2 files changed, 21 insertions(+), 25 deletions(-)
migration-tcp.c +11 -9
@@ -90,26 +90,28 @@ int tcp_start_outgoing_migration(MigrationState *s, const char *host_port) s->fd =qemu_socket (PF_INET ,SOCK_STREAM ,0 );if (s->fd ==-1 ) { -return -1 ; +return -socket_error (); }socket_set_nonblock (s->fd);do { ret =connect (s->fd, (struct sockaddr *)&addr,sizeof (addr)); -if (ret ==-1 ) - ret = -(socket_error ()); - -if (ret == -EINPROGRESS || ret == -EWOULDBLOCK ) +if (ret ==-1 ) { + ret = -socket_error (); + } +if (ret == -EINPROGRESS || ret == -EWOULDBLOCK ) {qemu_set_fd_handler2 (s->fd,NULL ,NULL , tcp_wait_for_connect, s); +return 0 ; + } }while (ret == -EINTR ); -if (ret <0 && ret != -EINPROGRESS && ret != -EWOULDBLOCK ) { +if (ret <0 ) {DPRINTF ("connect failed\n" );migrate_fd_error (s); - }else if (ret >=0 ) -migrate_fd_connect (s); - +return ret; + } +migrate_fd_connect (s);return 0 ; }
migration-unix.c +10 -16
@@ -89,35 +89,29 @@ int unix_start_outgoing_migration(MigrationState *s, const char *path) s->fd =qemu_socket (PF_UNIX ,SOCK_STREAM ,0 );if (s->fd <0 ) {DPRINTF ("Unable to open socket" ); - goto err_after_socket; +return -errno; }socket_set_nonblock (s->fd);do { ret =connect (s->fd, (struct sockaddr *)&addr,sizeof (addr)); -if (ret ==-1 ) +if (ret ==-1 ) { ret = -errno; - -if (ret == -EINPROGRESS || ret == -EWOULDBLOCK ) + } +if (ret == -EINPROGRESS || ret == -EWOULDBLOCK ) {qemu_set_fd_handler2 (s->fd,NULL ,NULL , unix_wait_for_connect, s); +return 0 ; + } }while (ret == -EINTR ); -if (ret <0 && ret != -EINPROGRESS && ret != -EWOULDBLOCK ) { +if (ret <0 ) {DPRINTF ("connect failed\n" ); - goto err_after_open; +migrate_fd_error (s); +return ret; } - -if (ret >=0 ) -migrate_fd_connect (s); - +migrate_fd_connect (s);return 0 ; - -err_after_open: -close (s->fd); - -err_after_socket: -return -1 ; }static void unix_accept_incoming_migration (void *opaque)
Signature · 1 line
1.7.6.2