From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=52419 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PsNYu-00062U-Kr for qemu-devel@nongnu.org; Wed, 23 Feb 2011 17:56:04 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PsNYp-00010u-5C for qemu-devel@nongnu.org; Wed, 23 Feb 2011 17:51:56 -0500 Received: from mx1.redhat.com ([209.132.183.28]:14950) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PsNYo-00010i-KY for qemu-devel@nongnu.org; Wed, 23 Feb 2011 17:51:55 -0500 From: Juan Quintela In-Reply-To: <4D658804.5040509@codemonkey.ws> (Anthony Liguori's message of "Wed, 23 Feb 2011 16:19:48 -0600") References: <7375b4a1acf712d700ee6619c8f740bed9a2729c.1298492768.git.quintela@redhat.com> <4D658804.5040509@codemonkey.ws> Date: Wed, 23 Feb 2011 23:50:24 +0100 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Subject: [Qemu-devel] Re: [PATCH 18/28] migration: convert current_migration from pointer to struct Reply-To: quintela@redhat.com List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Anthony Liguori Cc: qemu-devel@nongnu.org Anthony Liguori wrote: > On 02/23/2011 03:47 PM, Juan Quintela wrote: >> This cleans up a lot the code as we don't have to check anymore if >> the variable is NULL or not. >> >> Signed-off-by: Juan Quintela >> > > Yeah, but now you have to check for MIG_STATE_NONE. I don't think > this is an improvement. We can: a- remove max_throttle global (now we always have this variable to have fields in). b- transitioning to ACTIVE state is a normal transition (if you look, you will see that it is the only case where we call the migration notifier without an explicit change in state. c- We remove all the cases of: if (current_migration) foo(current_migration) Notice that we don't check against MIG_STATE_NONE in the whole patch. Later, Juan. > Regards, > > Anthony Liguori > >> --- >> migration.c | 121 ++++++++++++++++++++++++----------------------------------- >> 1 files changed, 49 insertions(+), 72 deletions(-) >> >> diff --git a/migration.c b/migration.c >> index 593adee..f8c6d09 100644 >> --- a/migration.c >> +++ b/migration.c >> @@ -34,7 +34,9 @@ >> /* Migration speed throttling */ >> static int64_t max_throttle = (32<< 20); >> >> -static MigrationState *current_migration; >> +static MigrationState current_migration = { >> + .state = MIG_STATE_NONE, >> +}; >> >> static NotifierList migration_state_notifiers = >> NOTIFIER_LIST_INITIALIZER(migration_state_notifiers); >> @@ -135,37 +137,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; >> } >> } >> >> @@ -344,11 +343,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) >> @@ -374,28 +369,22 @@ 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 = qemu_mallocz(sizeof(*s)); >> - >> - s->blk = blk; >> - s->shared = inc; >> - s->mon = NULL; >> - s->bandwidth_limit = bandwidth_limit; >> - s->state = MIG_STATE_NONE; >> + 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(¤t_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); >> @@ -403,8 +392,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; >> } >> @@ -413,43 +401,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(¤t_migration, p); >> #if !defined(WIN32) >> } else if (strstart(uri, "exec:",&p)) { >> - ret = exec_start_outgoing_migration(s, p); >> + ret = exec_start_outgoing_migration(¤t_migration, p); >> } else if (strstart(uri, "unix:",&p)) { >> - ret = unix_start_outgoing_migration(s, p); >> + ret = unix_start_outgoing_migration(¤t_migration, p); >> } else if (strstart(uri, "fd:",&p)) { >> - ret = fd_start_outgoing_migration(s, p); >> + ret = fd_start_outgoing_migration(¤t_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; >> } >> >> - qemu_free(current_migration); >> - current_migration = s; >> notifier_list_notify(&migration_state_notifiers); >> return 0; >> -free_migrate_state: >> - qemu_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(¤t_migration); >> return 0; >> } >> >> @@ -463,10 +443,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; >> } >> >>