migration: Add migration_rp_wait|kick()
It's just a simple wrapper for rp_sem on either wait() or kick(), make it even clearer on how it is used. Prepared to be used even for other things. Reviewed-by: Fabiano Rosas <farosas@suse.de> Signed-off-by: Peter Xu <peterx@redhat.com> Message-ID: <20231004220240.167175-8-peterx@redhat.com> Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
parent
1015ff5476
commit
5e79a4bf03
@ -1763,6 +1763,16 @@ static void mark_source_rp_bad(MigrationState *s)
|
|||||||
s->rp_state.error = true;
|
s->rp_state.error = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void migration_rp_wait(MigrationState *s)
|
||||||
|
{
|
||||||
|
qemu_sem_wait(&s->rp_state.rp_sem);
|
||||||
|
}
|
||||||
|
|
||||||
|
void migration_rp_kick(MigrationState *s)
|
||||||
|
{
|
||||||
|
qemu_sem_post(&s->rp_state.rp_sem);
|
||||||
|
}
|
||||||
|
|
||||||
static struct rp_cmd_args {
|
static struct rp_cmd_args {
|
||||||
ssize_t len; /* -1 = variable */
|
ssize_t len; /* -1 = variable */
|
||||||
const char *name;
|
const char *name;
|
||||||
@ -1835,7 +1845,7 @@ static int migrate_handle_rp_resume_ack(MigrationState *s, uint32_t value)
|
|||||||
MIGRATION_STATUS_POSTCOPY_ACTIVE);
|
MIGRATION_STATUS_POSTCOPY_ACTIVE);
|
||||||
|
|
||||||
/* Notify send thread that time to continue send pages */
|
/* Notify send thread that time to continue send pages */
|
||||||
qemu_sem_post(&s->rp_state.rp_sem);
|
migration_rp_kick(s);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -2464,7 +2474,7 @@ static int postcopy_resume_handshake(MigrationState *s)
|
|||||||
qemu_savevm_send_postcopy_resume(s->to_dst_file);
|
qemu_savevm_send_postcopy_resume(s->to_dst_file);
|
||||||
|
|
||||||
while (s->state == MIGRATION_STATUS_POSTCOPY_RECOVER) {
|
while (s->state == MIGRATION_STATUS_POSTCOPY_RECOVER) {
|
||||||
qemu_sem_wait(&s->rp_state.rp_sem);
|
migration_rp_wait(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->state == MIGRATION_STATUS_POSTCOPY_ACTIVE) {
|
if (s->state == MIGRATION_STATUS_POSTCOPY_ACTIVE) {
|
||||||
|
@ -316,6 +316,12 @@ struct MigrationState {
|
|||||||
* be cleared in the rp_thread!
|
* be cleared in the rp_thread!
|
||||||
*/
|
*/
|
||||||
bool rp_thread_created;
|
bool rp_thread_created;
|
||||||
|
/*
|
||||||
|
* Used to synchronize between migration main thread and return
|
||||||
|
* path thread. The migration thread can wait() on this sem, while
|
||||||
|
* other threads (e.g., return path thread) can kick it using a
|
||||||
|
* post().
|
||||||
|
*/
|
||||||
QemuSemaphore rp_sem;
|
QemuSemaphore rp_sem;
|
||||||
/*
|
/*
|
||||||
* We post to this when we got one PONG from dest. So far it's an
|
* We post to this when we got one PONG from dest. So far it's an
|
||||||
@ -527,4 +533,13 @@ void migration_populate_vfio_info(MigrationInfo *info);
|
|||||||
void migration_reset_vfio_bytes_transferred(void);
|
void migration_reset_vfio_bytes_transferred(void);
|
||||||
void postcopy_temp_page_reset(PostcopyTmpPage *tmp_page);
|
void postcopy_temp_page_reset(PostcopyTmpPage *tmp_page);
|
||||||
|
|
||||||
|
/* Migration thread waiting for return path thread. */
|
||||||
|
void migration_rp_wait(MigrationState *s);
|
||||||
|
/*
|
||||||
|
* Kick the migration thread waiting for return path messages. NOTE: the
|
||||||
|
* name can be slightly confusing (when read as "kick the rp thread"), just
|
||||||
|
* to remember the target is always the migration thread.
|
||||||
|
*/
|
||||||
|
void migration_rp_kick(MigrationState *s);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -4141,7 +4141,7 @@ static int ram_dirty_bitmap_sync_all(MigrationState *s, RAMState *rs)
|
|||||||
|
|
||||||
/* Wait until all the ramblocks' dirty bitmap synced */
|
/* Wait until all the ramblocks' dirty bitmap synced */
|
||||||
while (qatomic_read(&rs->postcopy_bmap_sync_requested)) {
|
while (qatomic_read(&rs->postcopy_bmap_sync_requested)) {
|
||||||
qemu_sem_wait(&s->rp_state.rp_sem);
|
migration_rp_wait(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
trace_ram_dirty_bitmap_sync_complete();
|
trace_ram_dirty_bitmap_sync_complete();
|
||||||
@ -4149,11 +4149,6 @@ static int ram_dirty_bitmap_sync_all(MigrationState *s, RAMState *rs)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ram_dirty_bitmap_reload_notify(MigrationState *s)
|
|
||||||
{
|
|
||||||
qemu_sem_post(&s->rp_state.rp_sem);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Read the received bitmap, revert it as the initial dirty bitmap.
|
* Read the received bitmap, revert it as the initial dirty bitmap.
|
||||||
* This is only used when the postcopy migration is paused but wants
|
* This is only used when the postcopy migration is paused but wants
|
||||||
@ -4237,10 +4232,13 @@ int ram_dirty_bitmap_reload(MigrationState *s, RAMBlock *block)
|
|||||||
qatomic_dec(&rs->postcopy_bmap_sync_requested);
|
qatomic_dec(&rs->postcopy_bmap_sync_requested);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We succeeded to sync bitmap for current ramblock. If this is
|
* We succeeded to sync bitmap for current ramblock. Always kick the
|
||||||
* the last one to sync, we need to notify the main send thread.
|
* migration thread to check whether all requested bitmaps are
|
||||||
|
* reloaded. NOTE: it's racy to only kick when requested==0, because
|
||||||
|
* we don't know whether the migration thread may still be increasing
|
||||||
|
* it.
|
||||||
*/
|
*/
|
||||||
ram_dirty_bitmap_reload_notify(s);
|
migration_rp_kick(s);
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
out:
|
out:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user