Skip to content

Commit

Permalink
migration: Add migration_rp_wait|kick()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
xzpeter authored and Juan Quintela committed Oct 11, 2023
1 parent 1015ff5 commit 5e79a4b
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 11 deletions.
14 changes: 12 additions & 2 deletions migration/migration.c
Original file line number Diff line number Diff line change
Expand Up @@ -1763,6 +1763,16 @@ static void mark_source_rp_bad(MigrationState *s)
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 {
ssize_t len; /* -1 = variable */
const char *name;
Expand Down Expand Up @@ -1835,7 +1845,7 @@ static int migrate_handle_rp_resume_ack(MigrationState *s, uint32_t value)
MIGRATION_STATUS_POSTCOPY_ACTIVE);

/* Notify send thread that time to continue send pages */
qemu_sem_post(&s->rp_state.rp_sem);
migration_rp_kick(s);

return 0;
}
Expand Down Expand Up @@ -2464,7 +2474,7 @@ static int postcopy_resume_handshake(MigrationState *s)
qemu_savevm_send_postcopy_resume(s->to_dst_file);

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) {
Expand Down
15 changes: 15 additions & 0 deletions migration/migration.h
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,12 @@ struct MigrationState {
* be cleared in the rp_thread!
*/
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;
/*
* We post to this when we got one PONG from dest. So far it's an
Expand Down Expand Up @@ -527,4 +533,13 @@ void migration_populate_vfio_info(MigrationInfo *info);
void migration_reset_vfio_bytes_transferred(void);
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
16 changes: 7 additions & 9 deletions migration/ram.c
Original file line number Diff line number Diff line change
Expand Up @@ -4141,19 +4141,14 @@ static int ram_dirty_bitmap_sync_all(MigrationState *s, RAMState *rs)

/* Wait until all the ramblocks' dirty bitmap synced */
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();

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.
* This is only used when the postcopy migration is paused but wants
Expand Down Expand Up @@ -4237,10 +4232,13 @@ int ram_dirty_bitmap_reload(MigrationState *s, RAMBlock *block)
qatomic_dec(&rs->postcopy_bmap_sync_requested);

/*
* We succeeded to sync bitmap for current ramblock. If this is
* the last one to sync, we need to notify the main send thread.
* We succeeded to sync bitmap for current ramblock. Always kick the
* 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;
out:
Expand Down

0 comments on commit 5e79a4b

Please sign in to comment.