migration: Replace QemuSemaphore with QemuEvent

pause_event can utilize qemu_event_reset() to discard events.

Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Link: https://lore.kernel.org/r/20250529-event-v5-7-53b285203794@daynix.com
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Akihiko Odaki 2025-05-29 14:45:56 +09:00 committed by Paolo Bonzini
parent 5e2312f75a
commit 952691b7a6
2 changed files with 10 additions and 13 deletions

View file

@ -1630,7 +1630,7 @@ void migration_cancel(void)
} }
/* If the migration is paused, kick it out of the pause */ /* If the migration is paused, kick it out of the pause */
if (old_state == MIGRATION_STATUS_PRE_SWITCHOVER) { if (old_state == MIGRATION_STATUS_PRE_SWITCHOVER) {
qemu_sem_post(&s->pause_sem); qemu_event_set(&s->pause_event);
} }
migrate_set_state(&s->state, old_state, MIGRATION_STATUS_CANCELLING); migrate_set_state(&s->state, old_state, MIGRATION_STATUS_CANCELLING);
} while (s->state != MIGRATION_STATUS_CANCELLING); } while (s->state != MIGRATION_STATUS_CANCELLING);
@ -2342,7 +2342,7 @@ void qmp_migrate_continue(MigrationStatus state, Error **errp)
MigrationStatus_str(s->state)); MigrationStatus_str(s->state));
return; return;
} }
qemu_sem_post(&s->pause_sem); qemu_event_set(&s->pause_event);
} }
int migration_rp_wait(MigrationState *s) int migration_rp_wait(MigrationState *s)
@ -2911,21 +2911,18 @@ static bool migration_switchover_prepare(MigrationState *s)
return true; return true;
} }
/* Since leaving this state is not atomic with posting the semaphore /*
* Since leaving this state is not atomic with setting the event
* it's possible that someone could have issued multiple migrate_continue * it's possible that someone could have issued multiple migrate_continue
* and the semaphore is incorrectly positive at this point; * and the event is incorrectly set at this point so reset it.
* the docs say it's undefined to reinit a semaphore that's already
* init'd, so use timedwait to eat up any existing posts.
*/ */
while (qemu_sem_timedwait(&s->pause_sem, 1) == 0) { qemu_event_reset(&s->pause_event);
/* This block intentionally left blank */
}
/* Update [POSTCOPY_]ACTIVE to PRE_SWITCHOVER */ /* Update [POSTCOPY_]ACTIVE to PRE_SWITCHOVER */
migrate_set_state(&s->state, s->state, MIGRATION_STATUS_PRE_SWITCHOVER); migrate_set_state(&s->state, s->state, MIGRATION_STATUS_PRE_SWITCHOVER);
bql_unlock(); bql_unlock();
qemu_sem_wait(&s->pause_sem); qemu_event_wait(&s->pause_event);
bql_lock(); bql_lock();
/* /*
@ -4057,7 +4054,7 @@ static void migration_instance_finalize(Object *obj)
qemu_mutex_destroy(&ms->qemu_file_lock); qemu_mutex_destroy(&ms->qemu_file_lock);
qemu_sem_destroy(&ms->wait_unplug_sem); qemu_sem_destroy(&ms->wait_unplug_sem);
qemu_sem_destroy(&ms->rate_limit_sem); qemu_sem_destroy(&ms->rate_limit_sem);
qemu_sem_destroy(&ms->pause_sem); qemu_event_destroy(&ms->pause_event);
qemu_sem_destroy(&ms->postcopy_pause_sem); qemu_sem_destroy(&ms->postcopy_pause_sem);
qemu_sem_destroy(&ms->rp_state.rp_sem); qemu_sem_destroy(&ms->rp_state.rp_sem);
qemu_sem_destroy(&ms->rp_state.rp_pong_acks); qemu_sem_destroy(&ms->rp_state.rp_pong_acks);
@ -4072,7 +4069,7 @@ static void migration_instance_init(Object *obj)
ms->state = MIGRATION_STATUS_NONE; ms->state = MIGRATION_STATUS_NONE;
ms->mbps = -1; ms->mbps = -1;
ms->pages_per_second = -1; ms->pages_per_second = -1;
qemu_sem_init(&ms->pause_sem, 0); qemu_event_init(&ms->pause_event, false);
qemu_mutex_init(&ms->error_mutex); qemu_mutex_init(&ms->error_mutex);
migrate_params_init(&ms->parameters); migrate_params_init(&ms->parameters);

View file

@ -379,7 +379,7 @@ struct MigrationState {
QemuSemaphore wait_unplug_sem; QemuSemaphore wait_unplug_sem;
/* Migration is paused due to pause-before-switchover */ /* Migration is paused due to pause-before-switchover */
QemuSemaphore pause_sem; QemuEvent pause_event;
/* The semaphore is used to notify COLO thread that failover is finished */ /* The semaphore is used to notify COLO thread that failover is finished */
QemuSemaphore colo_exit_sem; QemuSemaphore colo_exit_sem;