[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] Re: [PATCH 18/28] migration: convert current_migration from
From: |
Juan Quintela |
Subject: |
[Qemu-devel] Re: [PATCH 18/28] migration: convert current_migration from pointer to struct |
Date: |
Wed, 23 Feb 2011 23:50:24 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux) |
Anthony Liguori <address@hidden> 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<address@hidden>
>>
>
> 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;
>> }
>>
>>
- [Qemu-devel] [PATCH 16/28] migration: use global variable directly, (continued)
- [Qemu-devel] [PATCH 16/28] migration: use global variable directly, Juan Quintela, 2011/02/23
- Re: [Qemu-devel] [PATCH 16/28] migration: use global variable directly, Anthony Liguori, 2011/02/23
- [Qemu-devel] Re: [PATCH 16/28] migration: use global variable directly, Juan Quintela, 2011/02/23
- [Qemu-devel] Re: [PATCH 16/28] migration: use global variable directly, Anthony Liguori, 2011/02/23
- [Qemu-devel] Re: [PATCH 16/28] migration: use global variable directly, Juan Quintela, 2011/02/23
- Re: [Qemu-devel] Re: [PATCH 16/28] migration: use global variable directly, Markus Armbruster, 2011/02/24
- [Qemu-devel] Re: [PATCH 16/28] migration: use global variable directly, Paolo Bonzini, 2011/02/24
[Qemu-devel] [PATCH 17/28] migration: another case of global variable assigned to local one, Juan Quintela, 2011/02/23
[Qemu-devel] [PATCH 18/28] migration: convert current_migration from pointer to struct, Juan Quintela, 2011/02/23
[Qemu-devel] [PATCH 19/28] migration: Use bandwidth_limit directly, Juan Quintela, 2011/02/23
[Qemu-devel] [PATCH 07/28] migration: move migrate_create_state to do_migrate, Juan Quintela, 2011/02/23
[Qemu-devel] [PATCH 20/28] migration: Export a function that tells if the migration has finished correctly, Juan Quintela, 2011/02/23
[Qemu-devel] [PATCH 21/28] migration: Make state definitions local, Juan Quintela, 2011/02/23
[Qemu-devel] [PATCH 05/28] migration: Refactor MigrationState creation, Juan Quintela, 2011/02/23
[Qemu-devel] [PATCH 23/28] migration: add error handling to migrate_fd_put_notify()., Juan Quintela, 2011/02/23
[Qemu-devel] [PATCH 22/28] savevm: avoid qemu_savevm_state_iteate() to return 1 when qemu file has error., Juan Quintela, 2011/02/23